即使您可以按照描述的方式使用它们,但互斥锁并非设计用作通知/同步机制 . 它们旨在提供对共享资源的互斥访问 . 使用互斥锁来发出信号是很尴尬的,我想这看起来像这样(Thread2由Thread2发出信号):
线程1:
while(1) {
lock(mutex); // Blocks waiting for notification from Thread2
... // do work after notification is received
unlock(mutex); // Tells Thread2 we are done
}
线程2:
while(1) {
... // do the work that precedes notification
unlock(mutex); // unblocks Thread1
lock(mutex); // lock the mutex so Thread1 will block again
}
这有几个问题:
在Thread1完成"work after notification"之前,Thread2无法继续"do the work that precedes notification" . 使用这种设计,Thread2甚至不是必需的,也就是说,为什么不将"work that precedes"和"work after notification"移动到同一个线程中,因为只有一个可以在给定时间运行!
如果Thread2无法抢占Thread1,则Thread1会在重复while(1)循环时立即重新锁定互斥锁,并且即使没有通知,Thread1也会执行"work after notification" . 这意味着你必须以某种方式保证Thread2会在Thread1之前锁定互斥锁 . 你是怎样做的?可能通过睡眠或某些其他特定于操作系统的方式强制执行调度事件,但即使这不能保证根据时间,操作系统和调度算法工作 .
这两个问题并不轻微,事实上,它们都是主要的设计缺陷和潜在的错误 . 这两个问题的根源是要求在同一个线程中锁定和解锁互斥锁 . 那么你如何避免上述问题呢?使用条件变量!
顺便说一句,如果您的同步需求非常简单,您可以使用一个简单的旧信号量,避免条件变量的额外复杂性 .