`pthread_mutex_lock`和`pthread_cond_wait`在同一个队列上等待吗?

时间:2015-11-27 03:41:08

标签: c linux multithreading

我知道:

  • 如果所有者线程调用pthread_mutex_unlock,它将唤醒在互斥锁上阻塞的线程。
  • 如果所有者线程调用pthread_cond_wait,它将自动释放互斥锁并等待。
  • 如果所有者线程想要唤醒睡眠在其条件变量上的一个线程,它将执行pthread_cond_signalpthread_mutex_unlock

如果pthread_cond_signal本身可以唤醒那些阻塞线程,为什么我们需要pthread_mutex_unlock

1 个答案:

答案 0 :(得分:0)

pthread_cond_wait()阻塞调用线程,直到发出特定条件。此例程应在互斥锁被锁定时调用,并在等待时自动释放互斥锁。收到信号后,线程将被唤醒,互斥量将自动由线程使用。程序员需要在线程完成后处理解锁互斥锁。

当线程完成使用受保护数据时,使用

pthread_mutex_unlock(mutex)。当程序员想要在没有任何条件的情况下解锁互斥锁时,应该使用它。

pthread_cond_signal(condition)用于发信号(或唤醒)正在等待条件变量的另一个线程。这只能在只有一个线程处于阻塞等待状态时使用。对于多个线程处于阻塞等待状态,使用 pthread_cond_broadcast(condition)例程。

  

如果pthread_mutex_unlock本身可以,我们为什么需要pthread_cond_signal   唤醒那些阻塞线程?

查看此代码以了解您的问题

for (i=0; i<TCOUNT; i++) {
pthread_mutex_lock(&count_mutex);
count++;
/*
Check the value of count and signal waiting thread when condition is
reached. Note that this occurs while mutex is locked.
*/
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);
pthread_mutex_unlock(&count_mutex);
}
/* Do some "work" so threads can alternate on mutex lock */
sleep(1);
}
pthread_exit(NULL);

对于pthread_mutex_lock

pthread_mutex_lock (&mutex);
str.mul *= mymul;  /*Do some process on protected data*/
pthread_mutex_unlock (&mutex);

在第一个代码中,如果满足条件,则互斥锁由pthread_cond_signal()解锁。 在第二个代码中没有条件直接mutex将被解锁在这种情况下你可以使用pthread_mutex_unlock()

还有一件事,有时pthread_cond_signal()无法解锁互斥锁,这就是必须解锁互斥锁以完成例程的原因。