关于命名:Mutex名称 – 最佳实践?

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。