00001 // { dg-do run } 00002 00003 #include <omp.h> 00004 #include <assert.h> 00005 00006 #define N 10 00007 00008 struct B 00009 { 00010 static int icount; 00011 static int dcount; 00012 static int xcount; 00013 00014 B(); 00015 B(const B &); 00016 ~B(); 00017 B& operator=(const B &); 00018 void doit(); 00019 }; 00020 00021 int B::icount; 00022 int B::dcount; 00023 int B::xcount; 00024 00025 B::B() 00026 { 00027 #pragma omp atomic 00028 icount++; 00029 } 00030 00031 B::~B() 00032 { 00033 #pragma omp atomic 00034 dcount++; 00035 } 00036 00037 void B::doit() 00038 { 00039 #pragma omp atomic 00040 xcount++; 00041 } 00042 00043 static int nthreads; 00044 00045 void foo() 00046 { 00047 B b[N]; 00048 #pragma omp parallel private(b) 00049 { 00050 #pragma omp master 00051 nthreads = omp_get_num_threads (); 00052 b[0].doit(); 00053 } 00054 } 00055 00056 int main() 00057 { 00058 omp_set_dynamic (0); 00059 omp_set_num_threads (4); 00060 foo(); 00061 00062 assert (B::xcount == nthreads); 00063 assert (B::icount == (nthreads+1)*N); 00064 assert (B::dcount == (nthreads+1)*N); 00065 00066 return 0; 00067 }