C 在无人等待时发出条件变量信号的重要性?
在阅读一本关于并发性的书时,作者说信号量与条件变量在signal()的工作方式上不同。信号量跟踪对signal()的调用次数,而条件变量不跟踪。“在没有人等待时调用pthread_cond_信号没有效果”,它说。为什么这个细节很重要(我看到它在不同的地方重复了很多次)?使用的含义是什么?谢谢这意味着您必须有一个与条件变量相关联的“条件”。使用条件变量的方式如下:C 在无人等待时发出条件变量信号的重要性?,c,concurrency,semaphore,condition-variable,C,Concurrency,Semaphore,Condition Variable,在阅读一本关于并发性的书时,作者说信号量与条件变量在signal()的工作方式上不同。信号量跟踪对signal()的调用次数,而条件变量不跟踪。“在没有人等待时调用pthread_cond_信号没有效果”,它说。为什么这个细节很重要(我看到它在不同的地方重复了很多次)?使用的含义是什么?谢谢这意味着您必须有一个与条件变量相关联的“条件”。使用条件变量的方式如下: acquire the condition's mutex while (!condition) { wait on th
acquire the condition's mutex
while (!condition) {
wait on the condition variable
}
do whatever you need to do while holding the mutex
release the mutex
相应地,每当更新与条件变量关联的条件时,都必须在保持互斥锁的同时进行更新。这样,当阻塞条件变量时,在系统准备实际解除阻塞等待的线程之前,条件不可能发生更改。这意味着您必须有一个与条件变量相关联的“条件”。使用条件变量的方式如下:
acquire the condition's mutex
while (!condition) {
wait on the condition variable
}
do whatever you need to do while holding the mutex
release the mutex
相应地,每当更新与条件变量关联的条件时,都必须在保持互斥锁的同时进行更新。这样,当阻塞条件变量时,在系统准备实际解除阻塞等待的线程之前,条件不能更改。从概念上讲,信号量相当于受互斥体保护的互斥体、条件变量和整数计数器。在这种类比下,发布信号量相当于锁定互斥锁、递增计数器、向条件变量发送信号以及解锁互斥锁。即使并没有服务员,状态也会被修改 在这个类比中,信号灯的侍者所做的工作相当于:
当然,如果您讨论的是POSIX的具体情况,那么类比并不完全符合实际情况,因为信号量具有额外的异步信号安全属性,因此无法使用互斥体/condvar/count三元组实现它们。从概念上讲,信号量相当于互斥体、条件变量,和受互斥锁保护的整数计数器。在这种类比下,发布信号量相当于锁定互斥锁、递增计数器、向条件变量发送信号以及解锁互斥锁。即使并没有服务员,状态也会被修改 在这个类比中,信号灯的侍者所做的工作相当于:
当然,如果你说的是POSIX的具体案例,类比并不完全符合现实,因为信号量具有额外的异步信号安全属性,因此无法使用mutex/condvar/count三元组实现它们。请参阅,以了解两者之间差异的详细解释。请参阅,以了解两者之间差异的详细解释。谢谢。当您说pthread信号量具有“异步信号属性”时,您的意思是如果同时有两个线程,一个调用信号()和一个等待(),pthread将阻止在等待()之前调用信号()?否。我的意思是
sem_post
被指定为异步信号安全。这意味着您可以随时从信号处理程序调用它,即使在最坏的情况下,当代码中断时,同一线程处于“代码> > SIMEPOST 或sem_post
被指定为异步信号安全。这意味着您可以随时从信号处理程序调用它,即使在最坏可能的情况下,当代码中断时,同一线程处于“代码> > SIMEPOST 或