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

本文关键字:什么 不能 如果不 如果 | 更新日期: 2023-09-27 18:10:48

如果不命名互斥锁,我很难弄清楚它有多好。我特别想让我的Windows Mobile 6.5应用程序是单实例的。

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

遗憾的是,紧凑框架中互斥锁的CTORS不接受字符串——只能创建一个互斥锁。

现在,如果互斥对象没有关联的ID,那它有什么用呢?

我错过了什么吗?

我如何使用互斥锁来保护资源跨多个应用程序,如果我不能命名他们?

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

在紧凑的框架中,没有。

如果不能命名互斥锁又有什么用呢?

未命名的互斥锁称为局部互斥锁。您仍然可以使用它在同一进程中的不同线程之间进行同步。像lock关键字这样的监视器没有相同数量的功能。正如攻击者所指出的,互斥锁不允许递归入口。此外,监视器不能跨AppDomain边界使用。此外,互斥锁还可以与WaitHandle等有用的东西一起使用。WaitAll或WaitAny,其中监视器不能与这些东西一起使用。

我错过了什么吗?

No -在. net CF框架中,如果没有平台调用的帮助,你不能命名互斥锁。

我如何使用互斥锁来保护资源跨多个应用程序,如果我不能命名他们?

你必须给它们命名——你可以这么做,你只需要求助于一些平台调用。基于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. 另一个实例将无法获得写锁,因为第一个实例对它有锁,并且不会共享它。捕获异常并终止已经在运行的程序。
  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();
    

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

相关文章: