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(),则会一个一个等待,而不是出现相互覆盖或者无法访问文件(文件正在使用中)的错误。