从阿尔巴哈里阿尔巴里尔中学习多线程。在下面的示例中是否需要一个锁_locker
?我想没有,因为_message
受EventWaitHandle
保护。我说的对吗?
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);
}
}
}
}
发布于 2017-11-27 01:53:53
你是对的。
这类问题不能简单地用试错来检验。他们最好用逻辑思维来分析:
主线程只执行Main()
中的代码,工作线程只执行Work()
中的代码。所以这很简单。
如果您查看关键资源是如何访问的,您将注意到在Main()
中对Main()
的访问总是介于
_ready.WaitOne();
和
_go.Set();
而在_message
中对Work()
的访问总是介于
_go.WaitOne();
和
_ready.Set();
因此,其中一个线程在访问_message
之前总是等待另一个线程,并且不需要锁。
发布于 2017-11-27 02:59:35
同时阻止线程访问_message
变量。这里的逻辑是自给自足和可预测的,但情况并不总是如此。有时,您会从其他地方读取,并且流不是完全可控的,在这种情况下,您需要锁定关键变量。
https://stackoverflow.com/questions/47507919
复制相似问题