在不锁定互斥锁的情况下调用 pthread_cond_signal:不可靠的唤醒
与常见的误解相反,在不获取互斥锁的情况下调用 pthread_cond_signal 或 pthread_cond_broadcast 可能会导致错过唤醒唤醒,危及线程
为什么互斥锁至关重要
pthread_cond_signal 函数通知等待线程关联的条件已更改。但是,如果保护与条件相关的共享数据的互斥体未锁定,则可能会发生竞争条件。
考虑这样一种情况:一个线程 (A) 正在等待条件变量,而另一个线程 (B) ) 将条件设置为 true 并调用 pthread_cond_signal。如果没有互斥锁,线程 B 可能会在线程 A 仍在检查条件且尚未进入 pthread_cond_wait 调用时发出信号。
错过唤醒的风险
由于这种竞争条件,线程 A 可能会错过唤醒信号并无限期地保持等待。当线程 A 正在实现关键部分并需要及时通知共享数据的更改时,这种情况尤其成问题。
正确的同步模式
确保可靠的唤醒,应严格遵循以下同步模式:
pthread_mutex_lock(&mutex); // Change shared data pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
线程 B 仅应在获取互斥体并更改共享数据后发出信号,确保任何挂起的唤醒都将由线程 A 接收。
结论
锁定 pthread_cond_signal 调用周围的互斥体对于保护线程同步和防止错过唤醒至关重要。如果不这样做,可能会导致不可预测的、潜在灾难性的竞争状况。
以上是为什么在没有互斥锁的情况下调用'pthread_cond_signal”会导致不可靠的唤醒?的详细内容。更多信息请关注PHP中文网其他相关文章!