您好,編寫一個非常簡單的例子,說明如何使用omp flush來交換數據,以生產者 - >消費者的方式,在線程間發現一個有趣的行爲。#pragma omp flush使線程之間交換數據
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 /////////// Producer
{
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)
} // end producer
#pragma omp section /////////// Consumer
{
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; // no more data
} // end while(1)
}// end consumer
}// end sections
使用這個非常簡單的代碼會產生錯誤的輸出: 生產者一個:0標誌:1個TID 0
生產者一個:1標誌:1個TID 0
消費者一個:1標誌:1個計數1 TID 1
生產者一個:2標記:1個TID 0
消費者一個:2標記:1個計數2 TID 1
生產者一個:3標誌:1個TID 0
消費者一個:3標誌:1個計數3 TID 1
製片人a:4 flag:1 TID 0
消費者一個:4標誌:1個計數4 TID 1
生產者一個:5標誌:1個TID 0
消費者一個:5標誌:1個計數5 TID 1
生產者一個:6標誌:1個TID 0
消費者:6標誌:1個計數6 TID 1
生產者一個:7標誌:1個TID 0
消費者:7標誌:1個計數7 TID 1
生產者一個:8標誌:1個TID 0
消費者一個:8標誌:1計數8 TID 1
消費者a:8標誌:2計數9 TID 1
錯誤是第一個數據產生a = 0被消費者忽略。 如果我只是顛倒節的順序,讓生產者線程1,則一切正常..... 製作一個:0標誌:1個TID 1
消費者: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 /////////// Consumer
{
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; // no more data
} // end while(1)
}// end consumer
#pragma omp section /////////// Producer
{
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)
} // end producer
}// end sections
那現在工作得很好。謝謝 !
小錯誤....最後輸出的第一行是開始:製作一個:0標誌:1個TID 1 – GBBL 2011-02-24 21:44:02