如果发出pthread条件变量但是互斥锁被锁定会发生什么?

时间:2014-05-08 22:00:27

标签: c pthreads

请考虑以下事项:

pthread_mutex_t m;
pthread_cond_t c;

//a bunch of passenger threads will all be doing this
pthread_mutex_lock(&m); //passengers join the queue for boarding one at a time
pthread_cond_wait(&c, &m); //joined queue, mutex now unlocked allowing other passengers to join queue
//wait for a ride thread to signal the variable (representing the queue), allowing passengers to board one at a time
//
//Do some work in here required for boarding the ride
//
pthread_mutex_unlock(&m); //allow the next passenger to do the work required to board

我可以保证一次只有一名乘客可以访问“在这里做一些工作”部分吗?根据我的理解,一旦条件变量发出信号,该线程将重新锁定互斥锁并继续。如果在一个线程发出信号并开始工作后会发生什么情况,骑行线程会再次发出cond变量信号?第二个线程是否会等待第一个线程解锁互斥锁,或者两个线程现在都在“在这里做一些工作”部分?

1 个答案:

答案 0 :(得分:1)

考虑是否使用了pthread_cond_broadcast而不是pthread_cond_signal。条件中pthread_cond_wait中的所有线程都会发出警报以唤醒。其中只有一个可以,因为为了退出pthread_cond_wait,它们每个都必须重新获取互斥锁。获取互斥锁的那个完成并解锁互斥锁,然后下一个获取互斥锁。尽管唤醒线程超过了所需的性能,但这不应该改变正确使用pthread_cond_wait的代码的正确功能。

来自pthread_cond_wait的联机帮助页:

    "Spurious wakeups from the pthread_cond_timedwait() or pthread_cond_wait() functions may occur."

当线程从pthread_cond_wait返回时,它应该检查是否有数据(受互斥锁保护)表明它可以实际进行。典型地,这涉及执行pthread_cond_signal递增计数或设置标志(由互斥锁保护)的线程,以及在标志值为零时接收到等待调用的pthread_cond_wait循环的线程,并且如果它不为零则递减在它离开其互斥保护部分之前的标志。

我没有看到预期的循环,也没有看到您提供的snippit中的信号值。

相关问题