gpt4 book ai didi

multithreading - 为什么以及何时需要使用值> 1的信号量?

转载 作者:行者123 更新时间:2023-12-03 13:19:42 24 4
gpt4 key购买 nike

我很困惑为什么信号量在我们的值> 1时起作用,以及它们如何保护数据免于不一致。我知道值1的信号量与互斥量相同。我们使用互斥量来保护输出代码中的关键部分,尤其是当我们需要保护数据免于不一致时(这意味着一个线程可以在给定的时间内处理数据)。但是,值大于1的信号量可以访问多个线程的同一个Critical Section ...在这里,我不了解它是如何工作的。我们如何真正保护数据免于不一致,从而在给定的时间内仅对有限数量的线程进行操作。那些线程仍然可以在不相互排斥的情况下困惑。那么,使用值> 1的信号量有什么意义呢?我们什么时候要在互斥锁上使用它,为什么。

谢谢

最佳答案

想象一下,您的应用程序有多个与外部服务器通信的线程。该服务器允许您的应用程序在任何时候最多有五个未完成的请求。如果您真的很快发出了六个请求-也就是说,第六个请求在服务器响应前五个请求中的任何一个之前发生-服务器将阻止您的应用程序15分钟。

您可以使用信号量来控制它。您可以将信号量的初始值设置为5。当线程想要向服务器发出请求时,它会等待信号量。等待返回时,信号量将减少一。当信号量计数变为0时,等待的线程将被阻塞,直到其他线程释放它为止。

所以你有了:

sem = new Semaphore(5); // create semaphore with initial value of 5

当线程想要发出请求时:
sem.Wait();  // waits on semaphore. If there are 5 requests already, this will block
MakeRequest();
GetResponose();
sem.Release(); // release the semaphore, which will increment the count

现在,如果六个线程试图在很短的时间内发出请求,则前五个线程将被允许,而第六个线程必须等待,直到其中一个线程调用 sem.Release()为止。

真正的问题是,为什么要创建一个最大值小于两个的信号量。如果要进行互斥,则应使用互斥锁。值为1的信号量与互斥锁相似,但完全不同。特别是,互斥锁可确保互斥,因为获取锁的线程必须是释放该锁的线程。如果线程试图释放它没有获得的互斥锁,它将失败。但是使用信号量,任何线程都可以调用 Release,即使以前没有调用 Wait

关于multithreading - 为什么以及何时需要使用值> 1的信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304812/

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