Where is my flaw, regarding use of OpenMP critica
How does variable "not_findable" change from line 28 to 30, sometimes.
Code:
using namespace std;
#include <vector>
typedef size_t T;
#include <assert.h>
#include <omp.h>
#include <iostream>
void foo(T& F_count)
{
T I=0;
bool not_findable=false;
bool found=false;
#pragma omp parallel
{
bool finder=false;
while(true)
{
{
bool break_out;
#pragma omp critica()
{
if(!not_findable)
{
if(!(I<F_count))
not_findable=true;
++I;
}
cerr << not_findable << endl;
break_out=not_findable;
cerr << not_findable << endl;
}
if(break_out)
break;
}
{
#pragma omp critica()
{
if(true && !found)
{
found=true;
finder=true;
}
}
if(found)
break;
}
}
#pragma omp barrier
if(finder)
--F_count;
}
}
int main()
{
T F_count=0;
for(T I_count=0;I_count<4;++I_count)
{
++F_count;
foo(F_count);
assert(2<I_count || 0==F_count);
}
return 0;
}
# g++ -fopenmp a.cpp
# false;while [ $? != 0 ]; do echo 4 | ./a.out; done