Pthread条件等待和信号

时间:2012-10-26 12:59:55

标签: c linux multithreading pthreads

我对pthread_cond_wait和pthread_cond_signal函数有疑问。阅读完手册之后我也无法理解。

请考虑以下代码。

void* thread_handler(){
... // counts till COUNT_LIMIT is reached
if (count == COUNT_LIMIT) {
  pthread_cond_signal(&count_threshold_cv);
  printf("inc_count(): thread %ld, count = %d  Threshold reached.\n",
         my_id, count);
}
printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",
       my_id, count);
...
}

void* thread_handler1(){
... // waits till the previous thread has finished counting
pthread_mutex_lock(&count_mutex);
while (count<COUNT_LIMIT) {
   pthread_cond_wait(&count_threshold_cv, &count_mutex);
   printf("watch_count(): thread %ld Condition signal received.\n", my_id);
}
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}

代码按预期工作。我想了解代码。以下是该程序的工作原理

  1. 输入thread_handler1并执行cond_wait。从手册页中我了解到cond_wait将立即以原子方式释放锁。 那么为什么他们会在thread_handler1下面再次发布锁定

  2. 在第一个线程满足条件并且命中条件信号之后,我期望阻塞的线程执行其步骤。相反,我得到了执行cond_signal的线程下面的printfs。为什么会发生这种情况

  3. 总体而言,为什么我们需要在等待和发信号之前锁定。不能没有锁定就可以完成。

  4. 如需简要了解该计划,请参阅此处的Complete program。您可以在&#34;使用条件变量&#34;

    部分找到它

    提前致谢

    奇丹巴拉姆

1 个答案:

答案 0 :(得分:2)

  

输入thread_handler1并执行cond_wait。从我理解的手册页   cond_wait将立即以原子方式释放锁。那么为什么呢   他们在thread_handler1下面再次释放锁定

因为应该等待的线程在调用wait时释放锁定,但是在它发出信号后(当它变为可用时)将重新获取。这就是为什么你需要稍后明确重新发布它。

  

第一个线程满足条件并达到条件后   信号我期望阻塞的线程执行其步骤。   相反,我得到了执行该线程的线程下面的printfs   cond_signal。为什么会发生这种情况

因为调用signal不会从CPU切换线程。它将继续正常运行。