Mutex.TryOpenExisting() 是线程安全的吗?

问题描述 投票:0回答:1

我用

Mutex.TryOpenExisting()
。我想知道线程安全吗?

public class MutexNamedSystemDemo
{
    private const string _mutexName = @"Global\{C7F2DE44-8927-4B01-B8E1-D8F158A483A8}";
    private static Mutex _mutex;
    private static bool _intiallyOwned = false;
    private static int _count = 0;
    /*public MutexNamedSystemDemo()
     {
         _mutex = new Mutex(_intiallyOwned, _mutexName);
     }*/
 
     public void Main()
     {
         if (Mutex.TryOpenExisting(_mutexName, out _mutex) == false)
             _mutex = new Mutex(_intiallyOwned, _mutexName);
     }
}

有时执行时会出现

_mutex
null
的错误。如果是线程安全的,为什么会出现这种情况?

c# thread-safety task-parallel-library mutex
1个回答
0
投票

您似乎想检查给定名称的互斥锁是否存在,如果确实使用它,否则创建它。

如果是这种情况,你根本不需要打电话

Mutex.TryOpenExisting

您只需要:

_mutex = new Mutex(_intiallyOwned, _mutexName);

这是因为

Mutex
构造函数 的文档指出:

如果提供了名称,并且命名空间中已存在所请求类型的同步对象,则使用现有的同步对象。

© www.soinside.com 2019 - 2024. All rights reserved.