gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:56:10 25 4
gpt4 key购买 nike

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/

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