gpt4 book ai didi

c# - AutoResetEvent 和 maximumCount = 1 的信号量之间有什么区别吗?

转载 作者:可可西里 更新时间:2023-11-01 03:07:38 25 4
gpt4 key购买 nike

我正在阅读以下文章:

http://www.albahari.com/threading

而且我无法意识到 AutoResetEvent 和用 maximumCount = 1 初始化的信号量之间的区别。只是为了看看我是否做对了......这两种构造有什么区别吗?

谢谢!

最佳答案

是的,肯定有区别。 信号量 用于限制对资源或代码块的访问。当 WaitOne 被调用时,线程将阻塞,直到信号量的计数可用。要进行计数,您可以调用 Release。最大计数为 1 的信号量通常称为二进制信号量。这种性质的信号量只允许从单个线程访问资源或 block 代码。您可以使用二进制信号量代替互斥锁或监视器。关于 Semaphore 需要记住的重要一点是,它的状态是手动通过调用 WaitOneRelease 来控制的。

另一方面,AutoResetEvent 主要用作信号机制。一个线程将通过调用 WaitOne 等待信号而阻塞。另一个线程将调用 Set 来启动该信号。 ARE 将此信号发布给一个且仅一个线程,然后立即将 ARE 重置为无信号状态。关于 AutoResetEvent 需要记住的重要一点是,它是手动通过调用 Set 发出信号并自动重置在对 WaitOne 的单个调用返回后。

所以这里是差异的总结:

  • 信号量的状态是手动控制的。
  • AutoResetEvent 的状态是手动设置的,但会自动重置。
  • 使用 Semaphore 线程通常会平衡 ReleaseWaitOne 调用。
  • 对于 AutoResetEvent,一个线程通常被指定为发信号者,另一个线程是等待者。
  • 信号量 限制对资源或代码块的访问。
  • AutoResetEvent 向线程发出信号以采取某些操作。

AutoResetEvent 想象成通往走廊的门。在收到命令后,门将只允许一个人通过门。一旦有人穿过门,它就会立即关闭并等待另一个命令。只要门不断收到新命令,走廊就可以自由容纳与发出的命令数量一样多的人。

Semaphore 想象成通往同一走廊的门。门将允许一定数量的人进入走廊。门保持打开状态,直到走廊达到其占用限制,此时门会关闭。当有人从另一边离开走廊后,这扇门会再次打开。

更新:

这是一个最简单的示例,它可以证明某些东西明显不同。

static void Main()
{
var are = new AutoResetEvent(false);
are.Set();
are.Set();

var semaphore = new Semaphore(0, 1);
semaphore.Release();
semaphore.Release();
}

毫不奇怪,您会在第二次 semaphore.Release 调用中遇到异常,而第二次调用 Set 却顺利通过。原因是因为 ARE 正在设置 bool 标志,而信号量正在尝试增加计数。

WaitOne 方法将以相同的方式工作,但 ReleaseSet 方法不会。正是由于这个原因,二进制信号量不能与 ARE 互换。但是,在某些情况下,ARE 可以与二进制 信号量互换。

存在重叠的一种情况是在单个线程的锁存器的情况下。

public static void Main()
{
var latch = new AutoResetEvent(false);

new Thread(
() =>
{
latch.WaitOne(); // Wait for the latch.
}).Start();

latch.Set(); // Release the latch.
}

这是一个只能由 AutoResetEvent 满足的场景。

static void Main()
{
var are = new AutoResetEvent(false);

new Thread(
() =>
{
while (true)
{
are.WaitOne();
Console.WriteLine("go");
Thread.Sleep(2000);
}
}).Start();

while (true)
{
are.Set();
Console.WriteLine("pulse");
Thread.Sleep(1000);
}

}

关于c# - AutoResetEvent 和 maximumCount = 1 的信号量之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6481416/

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