2013-06-21 84 views
0

我想知道爲什麼下面的代碼給出了意想不到的輸出:a可以得到110 ...!pthread和條件變量

pthread_t th[nbT]; 
void * func(void *d) 
{  
    while(a<100) 
    { 
      pthread_mutex_lock(&l); 
      cout <<a <<" in thread "<<pthread_self()<<"\n"; 
      a+=1; 
      pthread_mutex_unlock(&l); 
    } 
    return NULL; 
} 
    int main(int argc, const char* argv[]) 
{ 
    for(int i=0;i<nbT;i++) 
      pthread_create(&(th[i]), NULL, func, NULL); 

    for(int i=0;i<nbT;i++) 
      pthread_join(th[i],NULL); 
} 
+2

什麼是NBT設置? – vdbuilder

+0

@vdbuilder設置爲16 – Sara

+0

我應該使用等待條件嗎? – Sara

回答

2

的問題是,你得到的鎖(互斥)檢查的條件,所以你不知道它是否仍然是真的還是假的,一旦你得到了鎖。你應該做一個簡單的複選:

while(a<100) 
{ 
     pthread_mutex_lock(&l); 
     cout <<a <<" in thread "<<pthread_self()<<"\n"; 
     if (a<100) a+=1; // <== Added condition here! 
     pthread_mutex_unlock(&l); 
}