C# 通过引用互斥

标签 c# concurrency mutex

我有一个相当简单的例子,两个线程与同一个数据结构交互。线程托管在它们自己负责的类中。假设这些是 Alfons 类和 Belzebub 类:

class Alfons {
    public Mutex listMutex = new Mutex();

    private void ProcessListInfo()
    {
        listMutex.WaitOne();

        //
        // ... Process multi-access list stuff ...
        //

        listMutex.ReleaseMutex();
    }
}

class Belzebub {
    private Alfons mCachedAlfonsReference;

    private void ProcessListInfoDifferently()
    {
        mCachedAlfonsReference.listMutex.WaitOne();

        //
        // ... Process multi-access list stuff in a different fashion ...
        //

        mCachedAlfonsReference.listMutex.ReleaseMutex();
    }
}

我的问题是,像这样引用 Mutex 是否会造成并发问题,或者是否建议这样做。是否有更好的方法来执行此操作?例如,我是否应该缓存互斥锁引用而不是通过引用访问它。

最佳答案

不会有并发问题 - 互斥锁应该是共享的。根据 Mutex MSDN docs

This type is thread safe.

但是,我会说数据结构本身应该同步来自不同线程的访问。如果数据结构不支持此功能(例如,使用 SyncRoot),请封装它并添加该功能。

出于好奇:您使用的是哪种数据结构?您可以考虑使用 System.Collections.Concurrent 之一无锁/细粒度锁定解决方案的集合。另外,不会使用 lock keyword让您的场景更简单、更不容易出错?

关于C# 通过引用互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257058/

相关文章:

java - ThreadPoolExecutor 中的死锁

c++ - 在 C++ 中接受基于线程表现不同的套接字包括

c - 在 pthread_mutex_init 之前调用 pthread_mutex_lock 是否安全?

c# - C# 泛型可以有特定的基类型吗?

c# - 将列表序列化为 JSON

c# - Entity Framework 6.0 错误与 Mysql 连接器 6.8.3.0

c++ - 线程保留锁的时间太长

c# - ASP.NET Core处理Web API中的自定义响应/输出格式的方法

c++ - 英特尔线程构建 block 并发队列 : Using pop() over pop_if_present()

mysql - 在Mysql中修改记录的并发控制最优雅的方法是什么?