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

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

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

不幸的是,紧凑框架中的互斥体的CTORS不需要字符串 – 只能创建一个互斥锁。

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

我错过了什么吗?

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

在紧凑的框架本身,没有没有。

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

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

我错过了什么吗?

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

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

你必须给它们命名 – 你可以这样做,你只需要求助于一些平台调用。 基于Windows CE的系统已经支持命名的互斥锁一段时间了。 您可以编写自己执行的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. 由于第一个实例锁定了它并且不会共享它,因此不同的实例将无法在其上获取写锁定。 捕获exception并终止程序,因为一个程序已在运行。
  4. 程序关闭时,清理锁。 即使进程exception崩溃或终止,也应删除对文件的锁定,以便启动另一个实例。 像这样的东西:

     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(); 

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