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(),則會一個一個等待,而不是出現相互覆蓋或者無法訪問文件(文件正在使用中)的錯誤。