gpt4 book ai didi

multithreading - 什么时候应该使用信号量?

转载 作者:行者123 更新时间:2023-12-03 16:20:52 25 4
gpt4 key购买 nike

什么时候使用信号量?

我能想到的唯一例子是限制同时访问相同数据/代码的线程数...

在信号灯将是最佳解决方案的任何其他方案?

最佳答案

信号量可能适合于进程之间的信令。 对于多线程编程,应避免使用信号量。 如果您需要对资源的独占访问权,请使用互斥锁。如果需要等待信号,请使用条件变量。

使用条件变量,甚至比使用信号量,甚至可以更简单,更安全地实现资源池的最常见情况。让我们看一下这种情况。一个带有信号量的幼稚实现看起来像(伪代码):

wait for semaphore to open
take a resource out of the pool
use the resource
put it back to the pool
open the semaphore for one more thread

第一个问题是信号量不能保护池不被多个线程访问。因此,需要另一种保护。让它成为一个锁:
wait for semaphore to open
acquire the lock for the pool
take a resource out of the pool
release the lock
use the resource
acquire the lock
put the resource back to the pool
release the lock
open the semaphore for one more thread

需要采取其他措施来确保池在访问时不为空。从技术上讲,可以绕过信号量访问池,但是这将破坏上述获取过程的资源可用性保证。因此,只能通过该过程访问该池。

到目前为止,一切都很好,但是如果线程不想被动地等待资源该怎么办?可以支持无阻塞资源获取吗?如果信号量本身支持无阻塞获取,这很容易。否则(例如在Windows上),这将是有问题的。无法绕过信号量,因为它会破坏阻塞情况。仅当池不为空时才通过信号量,如果在锁下进行操作,则可能导致死锁,但是一旦释放锁,空检查的结果就变得无用了。它可能是可行的(我没有尝试过),但是肯定会导致额外的复杂性。

使用条件变量,这很容易解决。这是带有阻塞获取的伪代码:
acquire the lock
while the resource pool is empty,
wait for condition variable to be signaled
take a resource out of the pool
release the lock
use the resource
acquire the lock
put the resource back to the pool
release the lock
signal the condition variable

在这种情况下,添加非阻塞采集没有问题:
acquire the lock
if the resource pool is not empty,
take a resource out of the pool
release the lock
if the pool was empty, return

如您所见,它甚至不需要访问条件变量,并且不会对阻塞情况造成伤害。对我来说,它明显优于使用信号量。

关于multithreading - 什么时候应该使用信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com