Hi, I am writing a very simple example on how to use omp flush for data exchange, in the method producer-> consumer, among the streams I found a funny behavior.
int a=-1;
int flag=1;
int count=0;
#pragma omp parallel num_threads(2)
{
int TID;
TID=omp_get_thread_num();
#pragma omp sections
{
#pragma omp section
{
for(int i=0; i<9;i++)
{
a=i;
#pragma omp flush(a)
flag=1;
printf("Producer a: %d flag:%d TID %d \n",a,flag,TID);
while(flag)
{
#pragma omp flush(flag)
}
}
flag=2;
#pragma omp flush(flag)
}
#pragma omp section
{
while(1) {
count++;
flag=0;
while(!flag)
{
#pragma omp flush(flag)
}
#pragma omp flush(a)
printf("Consumer a: %d Flag: %d count %d TID %d \n",a,flag,count,TID);
if (flag==2) break;
}
}
}
:
a: 0 flag: 1 TID 0
a: 1 : 1 TID 0
a: 1 : 1 1 TID 1
a: 2 : 1 TID 0
a: 2 : 1 2 TID 1
a: 3 flag: 1 TID 0
a: 3 : 1 3 TID 1
a: 4 flag: 1 TID 0
a: 4 : 1 4 TID 1
a: 5 flag: 1 TID 0
a: 5 : 1 5 TID 1
a: 6 flag: 1 TID 0
: 6 : 1 6 TID 1
a: 7 flag: 1 TID 0
: 7 : 1 - 7 TID 1
a: 8 flag: 1 TID 0
a: 8 : 1 8 TID 1
a: 8 : 2 count 9 TID 1
, , a = 0, .
, 1, .....
a: 0 flag: 1 TID 1
a: 0 : 1 1 TID 0
a: 1 : 1 TID 1
a: 1 : 1 2 TID 0
....
?
.....
Ejd () :
int a=-1;
int flag=0;
int count=0;
#pragma omp parallel num_threads(2)
{
int TID;
TID=omp_get_thread_num();
#pragma omp sections
{
#pragma omp section
{
while(1) {
count++;
if (flag) printf("Consumer a: %d Flag: %d count %d TID %d \n",a,flag,count,TID);
flag=0;
while(!flag)
{
#pragma omp flush(flag)
}
if (flag==2) break;
}
}
#pragma omp section
{
for(int i=0; i<9;i++)
{
a=i;
printf("Producer a: %d flag:%d TID %d \n",a,flag,TID);
flag=1;
while(flag)
{
#pragma omp flush(flag,a)
}
}
flag=2;
#pragma omp flush(flag)
}
}
. !