4

我正在查看Mutex(Boolean, String)页面,我完全糊涂了。如果我通过 true,我如何检查互斥锁是否归我所有或现在?然后我看到了Mutex(Boolean, String, out Boolean)并且可以使用第三个参数来检查。

我非常困惑。我测试过,如果另一个进程持有命名的互斥锁,新互斥锁不会返回 null 或抛出异常。但与其他我可以通过paran检查。那么构造函数和Mutex(Boolean)的意义何在?

4

3 回答 3

4

如果您想创建一个命名互斥体,但又不想拥有它,那么使用它似乎是理想的重载:

如果name不为 null 并且initiallyOwnedtrue,则仅当命名系统互斥体是作为此调用的结果创建时,调用线程才拥有互斥体。由于没有确定命名系统互斥体是否已创建的机制,因此在调用此构造函数重载时最好指定falseinitiallyOwned

重点补充

如果您使用Mutex(Boolean)构造函数创建一个本地互斥锁 - 在您的程序之外不可见。


似乎这个类的设计者倾向于在构造函数重载中保持一致的参数顺序——有些人可能设计了这个特定的构造initiallyOwned函数,根本没有参数——只是使用name. 但这更多是一种风格选择。

于 2012-08-01T10:27:40.183 回答
3

肯定永远不会返回 null ,Mutex(Boolean, String, out Boolean)因为它是构造函数以及其他两个构造函数。构造函数永远不会返回 null。

使用Mutex(Boolean, String)的原因几乎相同,但如果您不想知道它是否由您创建,则例外。

我相信除了例外,互斥量是相同的Mutex(Boolean),即互斥锁是未命名的,并且仅在一个(您的)进程内共享。

于 2012-08-01T10:22:37.770 回答
1

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

If name is not null and initiallyOwned is true, the calling thread owns the mutex only if the named system mutex was created as a result of this call. Since there is no mechanism for determining whether the named system mutex was created, it is better to specify false for initiallyOwned when calling this constructor overload. You can use the Mutex(Boolean, String, Boolean) constructor if you need to determine initial ownership

仅当您不关心您是否真的成功获得所有权时,才应使用 2 args 构造函数。

我承认有一个论点很奇怪,并建议只为所述论点传递一个值

于 2012-08-01T10:29:02.903 回答