.NET中的Mutex构造函数是否奇怪?

4
我正在查看 Mutex(Boolean, String) 页面,但我完全不明白。如果我传递 true,如何检查互斥量是否由我拥有?然后我看到了 Mutex(Boolean, String, out Boolean),并可以使用第三个参数进行检查。
我非常困惑。我测试了一下,新的互斥量没有返回 null 或抛出异常,即使另一个进程持有命名的互斥量。但是使用另一个构造函数可以通过参数检查。那么这个构造函数和 Mutex(Boolean) 的意义是什么?
3个回答

4
如果您想创建一个命名的互斥量,但不想拥有它,似乎最理想的重载是使用以下方法:
如果name不为null且initiallyOwned为true,则仅当该命名系统互斥量由此调用创建时,调用线程才拥有该互斥量。由于没有确定是否创建了命名系统互斥量的机制,因此在调用此构造函数重载时最好将initiallyOwned指定为false。
(强调添加)
如果使用Mutex(Boolean)构造函数,则会创建一个本地互斥量-在程序之外不可见。
似乎这个类的设计者更喜欢在构造函数重载中保持参数顺序的一致性-某些人可能会设计此特定构造函数而没有initiallyOwned参数,只有name参数。但这更多的是一种风格选择。

我认为这是“一致的参数排序”原因。虽然我无法理解为什么Mutex(bool)会有用。 - user34537

3

Mutex(Boolean, String, out Boolean)是一个构造函数,因此与另外两个构造函数一样,一定不会返回null。

Mutex(Boolean, String)用于几乎相同的目的,唯一的例外是在某种情况下,您不想知道是否由您创建。

我认为Mutex(Boolean)也提供了类似的功能,唯一的例外是,该互斥量是匿名的,并且仅在一个(您自己的)进程内共享。


1

我相信答案在备注下链接的页面上。

如果名称不为空且initiallyOwned为true,则仅当命名系统互斥体是由此调用创建时,调用线程才拥有互斥体。由于没有确定命名系统互斥体是否已创建的机制,因此在调用此构造函数重载时最好将initiallyOwned指定为false。如果需要确定初始所有权,则可以使用Mutex(Boolean,String,Boolean)构造函数。

只有在您不关心是否成功获取所有权时,才应使用2个参数的构造函数。

我同意这很奇怪,建议始终仅传递一个值作为该参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接