gpt4 book ai didi

c# - 信号量 - 初始计数有什么用?

转载 作者:IT王子 更新时间:2023-10-29 03:42:49 31 4
gpt4 key购买 nike

http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx

要创建信号量,我需要提供初始计数和最大计数。 MSDN 指出初始计数是 -

The initial number of requests for the semaphore that can be granted concurrently.

虽然它声明最大计数是

The maximum number of requests for the semaphore that can be granted concurrently.

我可以理解为maximum count是可以并发访问一个资源的最大线程数。但是,初始计数有什么用呢?

如果我创建一个初始计数为 0 且最大计数为 2 的信号量,则我的线程池线程都无法访问该资源。如果我将初始计数设置为 1,将最大计数设置为 2,则只有线程池线程可以访问该资源。只有当我将初始计数和最大计数都设置为 2 时,2 个线程才能同时访问资源。所以,我真的很困惑初始计数的意义?

SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

最佳答案

是的,当初始数字设置为 0 时 - 所有线程都将在您递增“CurrentCount”属性时等待。您可以使用 Release() 或 Release(Int32) 来实现。

Release(...) - 将增加信号量计数器

Wait(...) - 会递减它

您不能将计数器(“CurrentCount”属性)递增到大于您在初始化时设置的最大计数。

例如:

SemaphoreSlim^ s = gcnew SemaphoreSlim(0,2); //s->CurrentCount = 0
s->Release(2); //s->CurrentCount = 2
...

s->Wait(); //Ok. s->CurrentCount = 1
...

s->Wait(); //Ok. s->CurrentCount = 0
...

s->Wait(); //Will be blocked until any of the threads calls Release()

关于c# - 信号量 - 初始计数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706734/

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