与这个问题相关,命名互斥锁的最佳做法是什么?我意识到这可能会因操作系统甚至版本(尤其是 Windows)而异,因此请在回答时指定平台。我的兴趣是 Win XP 和 Vista。
5 回答
全局互斥锁的一个真正安全的名称是<a description> + <a GUID>
:
MyApp Single Instance Mutex : {c96f7db4-d743-4718-bef0-8533a198bcca}
通过使用这样的名称,其他人绝对不可能使用与您的互斥锁相同的互斥锁名称。
使用进程资源管理器四处探查,您可以看到 GUID 在一些地方使用,但一般情况下它们不使用。不过,确实出现的一种模式是“互斥锁”这个词被大量使用,而微软似乎喜欢使用首都。
建议:
将对象类型(在本例中为 Mutex)和应用程序命名空间合并到唯一名称中。这通常是安全的。如果您想真正安全,那么还要附加一个 Guid。
例子:
string mutexName = "MUTEX: Skyz.Messaging.ThreadPooling.MyAppSingleInstance";
好处:
通过为您的应用程序创建命名约定,您可以轻松管理许多对象名称,创建更具可读性的代码,并使现有和未来的开发人员非常容易理解代码。
提示:
与其在代码中直接使用 Mutex,不如编写一个可重用的包装类,它可以使代码更易于维护,以防您想要更改实现或添加调整。请记住使用一次性模式移除互斥锁,否则您会遇到问题!
using (SingletonProcess singletonProcess = new SingletonProcess("MUTEX: Skyz.Apps.MessagingQueue.InstanceMarker"))
{
if (singletonProcess.IsDuplicateInstance)
{
ConsoleWriter.WriteColorLine("An instance of the ExporterService exists, you cannot start a second instance.");
return
}
谷歌搜索 CreateMutex 样本显示“MyMutex”是最常用的互斥锁名称。
因此,您应该将互斥锁命名为“NotMyMutex”以保证唯一性。
您可以将您要保护的内容的描述与“Guard”一词结合起来
我过去没有使用过 GUID,但我开始认为这是个好主意——如果你想想世界上所有开发人员都在使用不同的软件。
除非您想出可以确定是唯一的非常晦涩的名称,否则您应该考虑 GUID。