2011-06-28 20 views
1

我对pthread_cond_signalpthread_cond_wait有疑问。例如,在下面的代码,根据我的理解,当可count_mutexinc_count的被解锁后才能被执行inc_count的调用调用pthread_cond_signal计数+ = 125WATCH_COUNT部关于pthread_cond_signal和pthread_cond_wait

count_mutexWATCH_COUNT部被解锁时调用pthread_cond_wait执行后调用pthread_mutex_unlockinc_count的只执行被锁定。我对吗?

void *inc_count(void *t) 
{ 
    int i; 
    long my_id = (long)t; 

    for (i = 0; i < TCOUNT; i++) 
    { 
     pthread_mutex_lock(&count_mutex); 
     count++; 

     if (count == COUNT_LIMIT) 
     { 
      pthread_cond_signal(&count_threshold_cv); 
     } 

     pthread_mutex_unlock(&count_mutex); 
    } 

    pthread_exit(NULL); 
} 

void *watch_count(void *t) 
{ 
    long my_id = (long)t; 

    pthread_mutex_lock(&count_mutex); 
    while (count < COUNT_LIMIT) 
    { 
     pthread_cond_wait(&count_threshold_cv, &count_mutex); 
     count += 125; 
    } 

    pthread_mutex_unlock(&count_mutex); 
    pthread_exit(NULL); 
} 

回答

5

pthread_cond_wait()解锁进入时的互斥锁,并在退出时再次锁定它。如果另一个线程在此期间获取了锁,则在该另一个线程释放锁之前,pthread_cond_wait()无法返回。

所以,如果watch_count()被挡在pthread_cond_wait()inc_count()运行,并呼吁pthread_cond_signal(),然后watch_count()将不会从pthread_cond_wait()返回,直到inc_count()呼吁pthread_mutex_unlock()。即使没有发信号,也可唤醒。这被称为虚假唤醒。因此watch_count()可以多次执行count+=125,即使inc_count()从不运行,或者从不呼叫pthread_cond_signal()

0

计数WATCH_COUNT部+ = 125只能count_mutex之后执行在inc_count的

是被解锁。

当执行pthread_cond_wait时,watch_count中的count_mutex被解锁,并且只有在inc_count中的pthread_mutex_unlock执行后才锁定。

是的,在这个意义上,当pthread_cond_wait回报watch_count持有互斥体,因此它只会inc_count返回后解锁了互斥。 (提供COUNTwhile第一次到达时,从低于COUNT_LIMIT开始..)

顺便说一句:这段代码伤了我的脑袋。我真的不会建议修改watch_count中的count,因为如果您有多个线程运行该功能并且您开始使用pthread_cond_broadcast,控制流可能很难确定。

+1

我从POSIX线程教程拷贝了这段代码,所以它只是为了学习的目的。 – MetallicPriest

相关问题