Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在无人等待时发出条件变量信号的重要性?_C_Concurrency_Semaphore_Condition Variable - Fatal编程技术网

C 在无人等待时发出条件变量信号的重要性?

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

在阅读一本关于并发性的书时,作者说信号量与条件变量在signal()的工作方式上不同。信号量跟踪对signal()的调用次数,而条件变量不跟踪。“在没有人等待时调用pthread_cond_信号没有效果”,它说。为什么这个细节很重要(我看到它在不同的地方重复了很多次)?使用的含义是什么?谢谢

这意味着您必须有一个与条件变量相关联的“条件”。使用条件变量的方式如下:

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 或 SimiaWalth的中间,这将是符合预期的。谢谢。当您说pthread信号量具有“异步信号属性”时,您的意思是如果同时有两个线程,一个调用信号()和一个等待(),pthread将阻止在等待()之前调用信号()?否。我的意思是
    sem_post
    被指定为异步信号安全。这意味着您可以随时从信号处理程序调用它,即使在最坏可能的情况下,当代码中断时,同一线程处于“代码> > SIMEPOST 或 SimiaWalth的中间,它将按预期运行。