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

Ray*_*Ray 5 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

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

我知道当Timer过去时,该RunSync方法将运行.但当它击中WaitOne()线时,线程被阻塞.但是谁在等待?哪个"其他"线程会发送信号?

Iva*_*oev 1

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

\n\n
\n

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

\n
\n\n

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

\n