Mutex names - best practice?
与这个问题相关,命名互斥体的最佳实践是什么?我知道这可能会随操作系统而变化,甚至随版本而变化(尤其是Windows),所以请在回答中指定平台。我对Win XP和Vista感兴趣。
全局互斥体的一个真正安全的名称是
1 | MyApp Single Instance Mutex : {c96f7db4-d743-4718-bef0-8533a198bcca} |
通过使用这样的名称,其他人绝对不会使用与您的互斥体相同的互斥体名称。
通过使用ProcessExplorer进行嗅探,您可以看到在一些地方使用了guid,但一般情况下它们是不使用的。不过,确实出现了一种模式,"mutex"这个词被大量使用,微软似乎喜欢使用capitol。
建议:
将对象类型(在本例中是互斥体)和应用程序命名空间合并到唯一的名称中。这通常是安全的。如果您想真正安全,那么也可以附加一个guid。
例子:
1 | string mutexName ="MUTEX: Skyz.Messaging.ThreadPooling.MyAppSingleInstance"; |
优势:
通过为应用程序创建命名约定,您可以轻松地管理许多对象名,创建更可读的代码,并使现有和未来的开发人员很容易理解代码。
提示:
不要在代码中直接使用互斥体,而是编写一个可重用的包装类,它可以使代码在需要更改实现或添加调整时更易于维护。记住使用一次性模式删除互斥体,否则会出现问题!
1 2 3 4 5 6 7 8 9 | 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"是所选的最常见的mutex名称。
因此,您应该将互斥体命名为"notmymutex",以确保其唯一性。
我以前没有使用过guid,但是我开始认为这是一个好主意——如果你想想世界上所有开发人员都在使用不同的软件的话。
除非你想的是一些非常模糊的名字,你可以确定它们是唯一的,否则你应该考虑一下guid。