C# Mutex 和Lock


1.Mutex是系统级别的,用户进程间的互斥(同步),所以可以用于锁定(一台电脑/操做系统)只能启动一个应用程序。

static void Main()
{
  bool createNew;
  Mutex mt = new Mutex(true, “ApplicationMutex”, out createNew);

        if (createNew)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Application.Run(new Form1());
        }
        else
        {
            MessageBox.Show("程序已经打开!");
            Process.GetCurrentProcess().Kill();
        }
}

其中mutex = new mutex(true,xx)中的true表示创建这个mutex的线程是否拥有这个mutex(互斥体)的所有权,如果为true,则只能在这个线程里release 这个mutex。这里创建互斥体的线程是UI线程,所以只能UI线程中release mutex,如果UI线程中创建了一个新的thread,这个新的thread是没有权限release mutex的。


2. Mutex也可以用于同一进程下的不同线程间同步:
private static int count = 0;
Mutex mutex = new Mutex(false );
public Form1()
{
  InitializeComponent();
  Task task1 = Task.Run(() => Increase());
  Task task2 = Task.Run(() => Decrease());
  Task.WaitAll(new Task[] { task1, task2 });
  Console.WriteLine(count);
}
private void Increase()
{
  mutex.WaitOne();//申请互斥体
   for (int i = 0; i < int.MaxValue; i++)
  { count++; }
  mutex.ReleaseMutex();
}
private void Decrease()
{
  mutex.WaitOne();
  for (int i = 0; i < int.MaxValue; i++)
  { count--; }
   mutex.ReleaseMutex();
}

3.lock一般用于同一进程下不同线程间的互斥,一般形式:

public class class1

{

  object filelock= new object(); 

  public writefile()

  {

    lock(filelock)

    {

      //wirte something to file

    }

  }

}

如果class1类中有多个线程同时访问writefile(),则会一个一个等待,而不是出现相互覆盖或者无法访问文件(文件正在使用中)的错误。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM