在没有互斥体的情况下调用 pthread_cond_signal 会危及信号吗?
一些文献表明,调用 pthread_cond_signal 需要事先锁定互斥体,然后再解锁。但是,您可以在不锁定互斥锁的情况下调用 pthread_cond_signal 或 pthread_cond_broadcast 吗?
答案:
不可以,在不先锁定互斥锁的情况下调用 pthread_cond_signal 或 pthread_cond_broadcast 是不安全的。这是通过涉及两个进程(A 和 B)的简单示例来说明的。
进程 A:
pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex);
进程 B(错误):
condition = TRUE; pthread_cond_signal(&cond);
如果条件开始为 FALSE 并且进程 B 尝试在没有互斥锁的情况下发出信号,则它由于指令交错,进程 A 可能会错过唤醒信号。
进程 B(正确):
pthread_mutex_lock(&mutex); condition = TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
锁定互斥锁进程 B 可以防止此问题,确保进程 A 接收到唤醒信号。
注意:虽然技术上可以移动pthread_cond_signal() 在 pthread_mutex_unlock() 之后,不推荐,因为它会降低线程调度效率。
以上是在没有互斥体的情况下调用'pthread_cond_signal”安全吗?的详细内容。更多信息请关注PHP中文网其他相关文章!