如果不能命名互斥锁,它还有什么用?
本文关键字:什么 不能 如果不 如果 | 更新日期: 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");
您还必须为ReleaseMutex
和CloseHandle
编写p/Invoke调用。
我特别想让我的Windows Mobile 6.5应用程序是单实例的。
命名互斥锁是一个解决方案。另一个可能对您有用的解决方案是使用文件锁。
- 如果不存在,在启动时创建一个名为foo.txt的文件。
- 通过
FileShare.None
获取文件的写锁 - 另一个实例将无法获得写锁,因为第一个实例对它有锁,并且不会共享它。捕获异常并终止已经在运行的程序。
程序关闭时,清理锁。即使进程崩溃或异常终止,也应该删除文件上的锁,允许另一个实例启动。像这样:
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可以由获取线程重新进入。互斥锁不能。所以,如果你有一个递归算法,说异步调用某些东西(是的,这是一个人为的例子,但它应该足以看到这个想法),你可以防止多个重叠的异步调用与互斥锁,但不是与监视器。