线程间同步之 Mutex(mutual exclusion 互斥量)
来源:互联网 发布:安居客盗图软件 编辑:程序博客网 时间:2024/06/05 19:17
http://www.cnblogs.com/yuqilin/archive/2011/10/21/2218833.html
Mutex是提供同步访问多个进程的一个类。和Monitor极其类似。
相同点:Mutex和Monitor都只能有一个线程拥有锁定。
区别:Mutex可用于进程内的线程同步,也可用于进程同步,一般用于进程同步。Monitor则只能用于进程内的线程同步。当进行进程内的线程同步时,优先选择Monitor。因为Monitor应用在用户模式下的线程同步技术,而Mutex是应用于内核级别的线程同步技术,线程的执行是在用户模式下执行的,而要切换到内核模式大概要消耗1000个CPU时钟,所以进行进程内的线程同步时优先选择Monitor,而进行进程间的同步时,Mutex是不二之选。
当声明Mutex时必须指定名称,否则只能进行进程内的线程同步。
如下所示:
1 bool blCreate;2 Mutex mutex=new Mutex(false,"MutexName",blCreate)
在同一个线程内mutex.WaitOne()和mutex.ReleaseMutex()必须成对出现。
下边举两个例子说明Mutex的应用
1、只能有一个程序实例在运行。
1 /// <summary> 2 /// 应用程序的主入口点。 3 /// </summary> 4 [STAThread] 5 static void Main() 6 { 7 bool ret; 8 System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret); 9 if (ret)10 {11 Application.EnableVisualStyles();12 Application.SetCompatibleTextRenderingDefault(false);13 System.Windows.Forms.Application.DoEvents();14 Application.Run(new Form1());15 mutex.ReleaseMutex();16 }17 }
程序执行的时候,只能允许有一个实例在执行,用是否是本程序创建的互斥量来判断,本程序是ret。
2、多个进程间用Mutex同步的例子。
创建一个Windows窗体应用程序,添加一个Button按钮,Form1窗体代码如下:
1 public Form1() 2 { 3 InitializeComponent(); 4 } 5 6 System.Threading.Mutex mutex = new System.Threading.Mutex(false, Application.ProductName); 7 private void button1_Click(object sender, EventArgs e) 8 { 9 Thread thd = new Thread(new ParameterizedThreadStart(MutexThread));10 thd.Start();11 12 }13 private void MutexThread( object obj)14 {15 try16 {17 mutex.WaitOne();18 MessageBox.Show("Get Mutex");19 Thread.Sleep(10000);20 }21 catch (Exception ex)22 {23 MessageBox.Show(ex.Message);24 }25 finally26 {27 mutex.ReleaseMutex(); 28 }29 }
生成完成后同时运行两个实例。
单击第一个实例的Button,再单击第二个实例的Button。可见实例一马上会弹出消息“Get Mutex”, 而实例二则等待10秒钟后才弹出来。
这是因为实例一开启了一个线程,这个线程锁定了名称为Application.ProductName的系统级的互斥量。而实例二只能等待实例一中的线程将互斥量释放掉以后,才能获得锁定。所以这才是实例二需要等待10秒钟的真正原因。
- 线程间同步之 Mutex(mutual exclusion 互斥量)
- 分布式process总结之二:Mutual Exclusion
- 线程同步之MUTEX
- 线程同步之互斥量mutex的使用
- 线程同步之互斥量mutex的使用
- Linux线程同步之互斥量(mutex)
- Linux线程同步之互斥量(mutex)
- 线程间同步 之 互斥锁 mutex
- 线程同步---互斥量mutex
- 线程同步--互斥量Mutex
- 线程同步之mutex篇
- 多线程之线程同步Mutex
- Linux线程同步: 互斥量(mutex)
- Linux线程同步-----互斥量(Mutex)
- 经典线程同步 互斥量Mutex
- Mutual Exclusion with Busy Waiting
- 多线程之七 经典线程同步 互斥量Mutex
- 多线程四 经典线程同步之互斥量Mutex
- C#简单文件管理器的实现
- java将文件打包成ZIP压缩文件的工具类实例
- 如何学好C++语言/C语言/
- 页面果滚动效果
- android国际化
- 线程间同步之 Mutex(mutual exclusion 互斥量)
- TDD: 解除依赖
- 为什么赋值运算符要防止自身赋值
- 电脑故障导致数据丢失如何恢复?
- Cassandra学习笔记之数据文件分布
- vs2010:error MSB4018 “CL”任务意外失败 (The "CL" task failed unexpectedly. )
- 设计模式五大原则
- 在linux命令行下编译执行java程序
- 重载与覆盖的区别