当一个线程调用WaitOne时,如何找到发回信号的其他线程?

时间:2015-08-22 13:35:09

标签: c# multithreading

我在多线程编程中难以理解的一件事是,当一个线程到达调用WaitOne()的行时,我如何知道涉及哪些其他线程?我在哪里或如何找到(或理解)WaitHandle如何接收信号?例如,我现在正在看这个代码:

private void RunSync(object state, ElapsedEventArgs elapsedEventArgs)
    {
        _mutex.WaitOne();
        using (var sync = GWSSync.BuildSynchronizer(_log))
        {
            try
            {
                sync.Syncronize();
            }
            catch(Exception ex)
            {
                _log.Write(string.Format("Error during synchronization : {0}", ex));
            }
        }
        _mutex.ReleaseMutex();
        _syncTimer.Interval = TimeBeforeNextSync().TotalMilliseconds;
        _syncTimer.Start();
    }

文件中有一些这样的方法(即RunThis(),RunThat())。这些方法在Windows服务中运行,并在Timer过去时调用。使用不同的定时器调用这些方法中的每一个并设置如下:

        //Synchro
        var timeBeforeFirstSync = TimeBeforeNextSync();
        _syncTimer = new System.Timers.Timer(timeBeforeFirstSync.TotalMilliseconds);
        _syncTimer.AutoReset = false;
        _syncTimer.Elapsed += RunSync;
        _syncTimer.Start();

据我所知,当Timer过去时,RunSync方法将会运行。但当它到达WaitOne()行时,线程被阻止。但是谁在等待?哪个“其他”线程会发送信号?

1 个答案:

答案 0 :(得分:1)

WaitHandle是一个抽象,如文档中所述:

  

封装等待独占访问共享资源的特定于操作系统的对象。

您不知道涉及哪些主题,但 通过检查其使用情况来了解涉及哪个代码句柄(_mutex在你的情况下)。每个WaitHandle派生类都继承WaitOne,但成功等待后会发生什么以及如何发出信号是特定的。例如,在您的示例_mutex中,Mutex类很可能是WaitOne类,因此ReleaseMutex的行为类似于“等到它空闲并取得所有权”,而RunThis则表示“释放”所有权和信号“。考虑到这一点,所有这些方法的作用应该是显而易见的 - 确保RunThat时{{1}}不能{{1}},反之亦然。