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