zoukankan      html  css  js  c++  java
  • 多线程编程中的锁定(Mutex)

    mutex 与监视器类似;它防止多个线程在某一时间同时执行某个代码块。事实上,名称“mutex”是术语“互相排斥 (mutually exclusive)”的简写形式。然而与监视器不同的是,mutex 可以用来使跨进程的线程同步。mutex 由 Mutex 类表示。

    当用于进程间同步时,mutex 称为“命名 mutex”,因为它将用于另一个应用程序,因此它不能通过全局变量或静态变量共享。必须给它指定一个名称,才能使两个应用程序访问同一个 mutex 对象。

    尽管 mutex 可以用于进程内的线程同步,但是使用 Monitor 通常更为可取,因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源。相比之下,Mutex 类是 Win32 构造的包装。尽管 mutex 比监视器更为强大,但是相对于 Monitor 类,它所需要的互操作转换更消耗计算资源。有关 mutex 的用法示例,请参见 Mutex。

    现实工作中,我们可以利用Mutex来实现单实例程序的检测。这其实就是对于应用程序级别的并发控制。

    下面是一个例子

    using System;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Mutex mutex = null;
                string mutexName = "WindowsApp";
                try
                {
                    mutex = Mutex.OpenExisting(mutexName);
                    if (mutex != null)
                    {
                        MessageBox.Show("该程序已经开始运行");
                        return;
                    }
                }
                catch { }
                finally
                {
                    mutex = new Mutex(true, mutexName);
                }
    
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
    
                mutex.ReleaseMutex();
            }
        }
    }
    
    如果是这样编写的代码,那么该应用程序可以运行一个实例,第二次的时候就会出现一个提醒框
    image 
  • 相关阅读:
    Boost Log : Log record formatting
    Boost Log : Attributes
    PLSA的EM推导
    特征处理:一点经验
    海量推荐系统:mapreduce的方法
    操作系统之存储器管理
    maredit测试
    算法:链表
    c++特别要点:多态性与虚函数
    sizeof的用法与字节对齐
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1287468.html
Copyright © 2011-2022 走看看