00001
00002
00003
00004 #include <omp.h>
00005
00006 extern "C" void abort (void);
00007
00008 struct S
00009 {
00010 S ();
00011 ~S ();
00012 S (const S &);
00013 int i;
00014 };
00015
00016 int n[3];
00017
00018 S::S () : i(18)
00019 {
00020 if (omp_get_thread_num () != 0)
00021 #pragma omp atomic
00022 n[0]++;
00023 }
00024
00025 S::~S ()
00026 {
00027 if (omp_get_thread_num () != 0)
00028 #pragma omp atomic
00029 n[1]++;
00030 }
00031
00032 S::S (const S &x)
00033 {
00034 if (x.i != 18)
00035 abort ();
00036 i = 118;
00037 if (omp_get_thread_num () != 0)
00038 #pragma omp atomic
00039 n[2]++;
00040 }
00041
00042 S
00043 foo ()
00044 {
00045 int i;
00046 S ret;
00047
00048 #pragma omp parallel for firstprivate (ret) lastprivate (ret) \
00049 schedule (static, 1) num_threads (4)
00050 for (i = 0; i < 4; i++)
00051 ret.i += omp_get_thread_num ();
00052
00053 return ret;
00054 }
00055
00056 S
00057 bar ()
00058 {
00059 int i;
00060 S ret;
00061
00062 #pragma omp parallel for num_threads (4)
00063 for (i = 0; i < 4; i++)
00064 #pragma omp atomic
00065 ret.i += omp_get_thread_num () + 1;
00066
00067 return ret;
00068 }
00069
00070 S x;
00071
00072 int
00073 main (void)
00074 {
00075 omp_set_dynamic (false);
00076 x = foo ();
00077 if (n[0] != 0 || n[1] != 3 || n[2] != 3)
00078 abort ();
00079 if (x.i != 118 + 3)
00080 abort ();
00081 x = bar ();
00082 if (n[0] != 0 || n[1] != 3 || n[2] != 3)
00083 abort ();
00084 if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
00085 abort ();
00086 return 0;
00087 }