00001
00002
00003
00004 #include <assert.h>
00005 #include <unistd.h>
00006
00007 struct S
00008 {
00009 public:
00010 int x;
00011 S () : x(-1) { }
00012 S (const S &);
00013 S& operator= (const S &);
00014 void test ();
00015 };
00016
00017 static volatile int hold;
00018
00019 S::S (const S &s)
00020 {
00021 #pragma omp master
00022 sleep (1);
00023
00024 assert (s.x == -1);
00025 x = 0;
00026 }
00027
00028 S&
00029 S::operator= (const S& s)
00030 {
00031 assert (s.x == 1);
00032 x = 2;
00033 return *this;
00034 }
00035
00036 void
00037 S::test ()
00038 {
00039 assert (x == 0);
00040 x = 1;
00041 }
00042
00043 static S x;
00044
00045 void
00046 foo ()
00047 {
00048 #pragma omp sections firstprivate(x) lastprivate(x)
00049 {
00050 x.test();
00051 }
00052 }
00053
00054 int
00055 main ()
00056 {
00057 #pragma omp parallel num_threads(2)
00058 foo();
00059
00060 assert (x.x == 2);
00061 return 0;
00062 }