gpt4 book ai didi

multithreading - "C# 3.0 in a Nutshell"中关于线程的文本说明

转载 作者:行者123 更新时间:2023-12-04 12:25:28 24 4
gpt4 key购买 nike

阅读时 C# 3.0 简述 作者 Joseph 和 Ben Albahari,我看到了以下段落(第 673 页,标题为“ 等待和脉冲信号 ”部分的第一段)

"The Monitor class provides another signalling construct via two static methods, Wait and Pulse. The principle is that you write the signalling logic yourself using custom flags and fields (enclosed in lock statements), and then introduce Wait and Pulse commands to mitigate CPU spinning. The advantage of this low-level approach is that with just Wait, Pulse, and the lock statement, you can achieve the functionality of AutoResetEvent, ManualResetEvent, and Semaphore, as well as WaitHandle's static methods WaitAll and WaitAny. Furthermore, Wait and Pulse can be amenable in situations where all of the wait handles are parsimoniously challenged."



我的问题是,对最后一句话的正确解释是什么?
  • 具有大量/大量等待句柄的情况,其中 WaitOne() 仅偶尔在任何特定等待句柄上调用。
  • 一种具有大量/大量等待句柄的情况,其中很少有一个以上的线程倾向于阻塞任何特定的等待句柄。
  • 一些其他的解释。

  • 也希望能阐明此类情况的示例,以及如何和/或为什么通过 Wait 和 Pulse 而不是其他方法更有效地处理它们。

    谢谢!

    编辑:我在网上找到了文字 here

    最佳答案

    这就是说,在某些情况下,Wait 和 Pulse 提供了比等待句柄更简单的解决方案。通常,这种情况发生在:

  • 服务员,而不是通知者,决定何时解除封锁
  • 阻塞条件涉及的不仅仅是一个简单的标志(可能是几个变量)

  • 在这些情况下,您仍然可以使用等待句柄,但等待/脉冲往往更简单。 Wait/Pulse 的伟大之处在于,Wait 在等待时释放底层锁。例如,在下面的例子中,我们在一个锁的安全范围内读取 _x 和 _y - 但是该锁在等待时被释放,以便另一个线程可以更新这些变量:
    lock (_locker)
    {
    while (_x < 10 && _y < 20) Monitor.Wait (_locker);
    }

    然后另一个线程可以原子地更新 _x 和 _y(借助锁),然后 Pulse 向服务员发出信号:
    lock (_locker)
    {
    _x = 20;
    _y = 30;
    Monitor.Pulse (_locker);
    }

    等待/脉冲的缺点是更容易出错和犯错(例如,通过更新变量而忘记脉冲)。在带有等待句柄的程序与带有等待/脉冲的程序同样简单的情况下,我建议出于这个原因使用等待句柄。

    在效率/资源消耗方面(我认为您是在暗示),Wait/Pulse 通常更快更轻(因为它具有托管实现)。不过,这在实践中很少有什么大不了的。在这一点上,Framework 4.0 包括 ManualResetEvent 和 Semaphore(ManualResetEventSlim 和 SemaphoreSlim)的低开销托管版本。

    Framework 4.0 还提供了更多同步选项,以减少对等待/脉冲的需求:
  • 倒计时事件
  • 屏障
  • PLINQ/数据并行(AsParallel、Parallel.Invoke、Parallel.For、Parallel.ForEach)
  • 任务和延续

  • 所有这些都比 Wait/Pulse 高级得多,而且 IMO 更适合编写可靠且可维护的代码(假设它们将解决手头的任务)。

    关于multithreading - "C# 3.0 in a Nutshell"中关于线程的文本说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322694/

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