一个进程可以同时在两个信号量上“关闭”吗?

时间:2014-03-17 02:13:34

标签: c kernel semaphore

假设两个信号量正在保护一段关键代码,而您只希望在两个代码都可用的情况下执行一段关键代码。是否有写这个的模式?

换句话说,是否有一个声明如下:“如果信号量a和b可用,那么运行......否则睡觉”?

1 个答案:

答案 0 :(得分:0)

实现此目的的最简单方法是使用单个pthread_mutex_t来保护某个状态,并使用单个pthread_cond_t在状态发生变化时通知所有线程。如果你总是在condvar上播放,那么你总是会唤醒所有等待的线程。然后,线程可以执行任意复杂的测试并更新共享状态。

当然,这不是最有效的解决方案,因为当状态不满足他们正在等待的状态时(它们必须重新进入睡眠状态),它可能会唤醒线程。它也可能导致饥饿,因为线程可能总是在等待condvar时发现自己在队列的后面,并且当它唤醒时永远不会找到可接受的状态。

如果不了解您要解决的问题的更多细节,很难给出一个紧密的答案。

pthreads不允许您以原子方式获取多个锁/信号量;但是,正如@Greg指出的那样,您可以通过为锁/信号量分配一个命令来避免死锁,并让线程始终按该顺序获取它们。当然,在开始获取任何锁之前,您必须知道要获取哪些锁。如果在获得当前锁定之前无法确定要获取的下一个锁定,则无法正常工作,因为您可能需要锁定无序。如果您释放所有锁并重新开始,您可能会发现状态已更改,要求您获取一组不同的锁,这可能会导致活锁。