Mutex名称 - 最佳实践?

Arg*_*tyr 7 naming mutex

此问题相关,命名互斥锁的最佳做法是什么?我意识到这可能会因操作系统甚至版本(尤其是Windows)而有所不同,所以请在回答时指定平台.我的兴趣在于Win XP和Vista.

Sam*_*ron 8

全局互斥锁的一个非常安全的名称是<a description> + <a GUID>:

MyApp Single Instance Mutex : {c96f7db4-d743-4718-bef0-8533a198bcca}
Run Code Online (Sandbox Code Playgroud)

通过使用这样的名称,其他人绝对不可能使用与互斥锁相同的互斥锁名称.

使用进程资源管理器嗅探,您可以看到GUID在一些地方使用,但通常不使用它们.确实出现的一种模式是"mutex"这个词被大量使用,微软似乎喜欢使用capitols.

  • 我会说在名字中使用GUID会因为唯一性的偏执而过度. (5认同)
  • ...除非他们故意复制你的互斥锁的名字...... ;-) (2认同)

Rai*_*ord 5

建议:

将对象类型(在本例中为互斥体)和应用程序命名空间合并到唯一名称中。这通常是安全的。如果你想真正安全,那么还可以附加一个 Guid。

例子:

    string mutexName = "MUTEX: Skyz.Messaging.ThreadPooling.MyAppSingleInstance";
Run Code Online (Sandbox Code Playgroud)

优点:

通过为应用程序创建命名约定,您可以轻松管理许多对象名称,创建更易读的代码,并使现有和未来的开发人员更容易理解代码。

提示:

不要直接在代码中使用互斥体,而是编写一个可重用的包装类,这样可以使代码更易于维护,以防您想要更改实现或添加调整。请记住使用一次性模式删除互斥体,否则您会遇到问题!

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  


            }
Run Code Online (Sandbox Code Playgroud)