pthread和条件变量

时间:2013-06-21 18:27:26

标签: pthreads conditional-statements

我想知道为什么以下代码会产生意外输出:a可以获得110 ......!

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);
 }

1 个答案:

答案 0 :(得分: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);
}