c# - 如果我有 EventWaitHandle,我需要锁吗

标签 c# multithreading thread-synchronization

albahari atricle 学习多线程. 在下面的示例中我需要锁 _locker 吗?我想不会,因为 _messageEventWaitHandle 保护。我说得对吗?

class TwoWaySignaling
{
  static EventWaitHandle _ready = new AutoResetEvent (false);
  static EventWaitHandle _go = new AutoResetEvent (false);
  static readonly object _locker = new object();
  static string _message;

  static void Main()
  {
    new Thread (Work).Start();

    _ready.WaitOne();                  // First wait until worker is ready
    lock (_locker) _message = "ooo";
    _go.Set();                         // Tell worker to go

    _ready.WaitOne();
    lock (_locker) _message = "ahhh";  // Give the worker another message
    _go.Set();
    _ready.WaitOne();
    lock (_locker) _message = null;    // Signal the worker to exit
    _go.Set();
  }

  static void Work()
  {
    while (true)
    {
      _ready.Set();                          // Indicate that we're ready
      _go.WaitOne();                         // Wait to be kicked off...
      lock (_locker)
      {
        if (_message == null) return;        // Gracefully exit
        Console.WriteLine (_message);
      }
    }
  }
}

最佳答案

你是对的。

这类问题不能简单地通过反复试验来测试。最好用逻辑思维来分析它们:

  • 哪个线程运行哪个代码?
  • 现在另一个线程会发生什么?
  • 如果另一个线程获得更多 CPU 时间会怎样?等

主线程只会执行Main()中的代码,工作线程只会执行Work()中的代码。这很简单。

如果您查看关键资源的访问方式,您会注意到 Main() 中对 _message 的访问始终介于

_ready.WaitOne();

_go.Set();

而在 Work() 中访问 _message 总是介于

_go.WaitOne();

_ready.Set();

因此,其中一个线程在访问 _message 之前将始终等待另一个线程,因此不需要锁。

关于c# - 如果我有 EventWaitHandle,我需要锁吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507919/

相关文章:

java - 持有两个对象的锁

java - 同步定期更新和创建、更新、删除操作

c# - 使用 C# 从音频 CD 导入数据?

c# - 如何在 .NET Core 类库中引用 Visual Studio 共享项目

c# - GridView 中的 RowCommand 在单击时引发多个事件

Java JProgressBar 不通过 setVisible(true) 显示

java - 如何启动不阻塞Java主线程的后台线程?

c# - WPF。列表框。如何将所选项目的最大值限制为 2?

c# - 2 关于命名管道的问题

java - 如何处理需要组合起来创建响应的多个客户端请求?