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