我在某处读到,我们应该在调用pthread_cond_signal之前锁定mutex,并在调用后解锁mutex:
pthread_cond_signal()例程用于向等待condition变量的另一个线程发出信号(或唤醒)。它应该在锁定mutex之后调用,并且必须在pthread_cond_wait()例程完成之前解锁mutex。
我有一个问题:没有锁定mutex,调用pthread_cond_signal或pthread_cond_broadcast方法是否可以?
答案是不行。在调用这些方法之前,必须先锁定mutex以确保线程安全。如果未锁定mutex,则可能会导致意外结果。所以,在调用这些例程之前,请始终锁定mutex,并在调用之后解锁mutex。
pthread_signal_cond()
可以在互斥锁解锁之后移动,虽然最好不要这样做。或许更准确地说,在调用pthread_signal_cond()
时,你已经需要锁定互斥锁来修改条件本身了。 - cafpthread_cond_timedwait()
或pthread_cond_wait()
操作,那么该互斥锁和条件变量之间形成了一种动态绑定,只要至少有一个线程被阻塞在条件变量上,该绑定就会生效。在此期间,任何线程尝试使用不同的互斥锁等待该条件变量的行为是未定义的。" - cafpthread_cond_wait()
调用是原子性的,它会释放互斥锁并在条件变量上等待。当被唤醒后,在返回之前重新获取互斥锁。这就是为什么需要将已加锁的互斥锁传递给该函数的原因。 - caf