如果您不能命名,互斥锁有什么用?

时间:2011-10-06 19:21:26

标签: c# compact-framework mutex windows-mobile-6.5

我很难在没有命名的情况下搞清楚互斥锁的优点。具体来说,我想让我的Windows Mobile 6.5应用程序单实例。

本网站上有一些关于如何做到这一点的问题和答案 - 最好的问题和答案似乎都使​​用了命名的互斥体。

Unfortunately the CTORS for mutexes in compact framework do not take a string - 只能创建一个互斥锁。

现在,如果没有关联的ID,互斥量有什么用呢?

我错过了什么吗?

如果我无法为多个应用程序命名,如何使用互斥锁保护资源?

2 个答案:

答案 0 :(得分:14)

在紧凑的框架中,没有。

  

如果您无法命名互斥锁,有什么用途?

一个未命名的互斥锁据说是本地互斥锁。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock关键字这样的监视器没有相同的功能。正如ctacke所述,互斥锁不允许递归入口。此外,不能跨AppDomain边界使用监视器。此外,Mutex可以与WaitHandle.WaitAllWaitAny等有用的内容一起使用,其中监视器不能与任何这些内容一起使用。

  

我错过了什么吗?

否 - 在.NET CF Framework中,如果没有平台调用的帮助,则无法命名互斥锁。

  

如果我无法为多个应用程序命名,如何使用互斥锁保护资源?

你必须为它们命名 - 你可以这样做,你只需要求助于一些平台调用。基于Windows CE的系统暂时有supported个名为互斥锁。您可以编写一个自己动手的P / Invoke调用:

[DllImport("Coredll.dll")]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool initialOwner, string lpName);

并将其用作(例如)CreateMutex(IntPtr.Zero, false, "MutexName");

你还必须为ReleaseMutexCloseHandle编写P / Invoke电话。


  

具体来说,我想将我的Windows Mobile 6.5应用程序设为单实例。

命名互斥是一种解决方案。另一个可能适合您的解决方案是使用文件锁。

  1. 如果不存在,则在启动时创建名为foo.txt的文件。
  2. 使用FileShare.None在文件文件上获取写锁定。
  3. 不同的实例将无法获取写锁定,因为第一个实例锁定了它并且不会共享它。捕获异常并终止程序,因为一个程序已在运行。
  4. 程序关闭时,清理锁。即使进程异常崩溃或终止,也应删除对文件的锁定,以允许另一个实例启动。像这样:

    FileStream stream;
    try
    {
         stream = new FileStream("lock.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
    }
    catch
    {
        MessageBox.Show("Program is already running.");
        return;
    }
    //Put your application code here.
    MessageBox.Show("Program is now running.");
    stream.Close();
    

答案 1 :(得分:2)

Monitor(其中lock是语法糖)和Mutex之间的区别很微妙,特别是在您查看单个进程时。可以通过获取线程重新输入监视器。互斥体不能。因此,如果你有一个递归算法,说是异步调用某些东西(是的,这是一个人为的例子,但它应该足以看到这个想法),你可以防止多个重叠异步调用与Mutex,但不能与监视器。