search.png
关于我
menu.png
浅学C#(24)——线程互斥、Mutex类
用Mutex类实现互斥

WaitOne public virtual bool WaitOne( )
分配互斥体访问权,该方法只向一个线程授予对互斥体的独占访问权
ReleaseMutex
如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程用该方法释放该互斥体

bool  createdNew; 
Mutex  mutex=new Mutex( false, “MyMutex”, out createdNew )

在Mutex类构造函数中,可以指定互斥锁定是否最初应由调用线程所拥有,定义互斥锁定的名称,获得互斥锁定是否已存在的信息
互斥锁定可以在另一个进程中定义,因为操作系统知道有名称的互斥锁定,它由不同的进程共享
如果没有给互斥锁定指定名称,互斥锁定就是未命名的,不在不同的进程间共享

if ( Mutex.WaitOne() )
{
     try
    {
        ……
     }
     finally
    {
        mutex.ReleaseMutex( );
    }
}
else
{
      ……
}

因为系统知道有名称的互斥锁定,因此可以禁用它启动应用程序两次

[STAThread]
Static void Main()
{
  bool  createdNew;
    Mutex  mutex=new Mutex( false, “MyMutex”, out  createdNew );
   if  ( ! createdNew )
  {
      MessageBox.Show(“You can only start one instance of the application”);
      Application.Exit();
      return;
   }
    ……
}
Semphore类

旗语锁定是一种计数的互斥锁定,可以同时由多个线程使用
使用旗语锁定可以定义允许同时访问受旗语锁定保护的资源的线程个数
如果有多个可用资源,且只允许一定数量的线程访问该资源,就可以使用信号量
Semaphore类可以命名,使用系统范围内的资源,允许在不同进程之间同步。SemaphoreSlim类是对于较短等待时间进行了优化的轻型版本

版权声明

知识共享许可协议 本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
发布时间:2019年01月26日 12:57:48

评论区#

还没有评论哦,期待您的评论!

关闭特效