如何在代码中锁定多个临界区?

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

我正在学习 C# 中的多线程,发现

Mutex
类可以帮助我同步线程工作。所以,我想使用
ThreadPool
(限制为 10 个线程),并且该线程有时应该等待,因为我的代码中有多个关键部分。我对一些 Web 服务和数据库进行了一些调用,并且我想处理只有一个线程可以同时访问此外部资源的情况。

例如:

Mutex mutex = new Mutex(true);

//method for DB Access
private void callDB()
{
    mutex.WaitOne();
    //Do DB Call
    mutex.ReleaseMutex();
}

//method for WS1
private void callWS1()
{
    mutex.WaitOne();
    //Do WS Call
    mutex.ReleaseMutex();
}

我的班级里只有一个互斥锁。例如,如果线程 1 执行

callDB
并释放下一个线程的互斥体,那么如果线程 1 到达
callWS1
方法并在那里锁定互斥体,会发生什么?

互斥锁是对整个类(以及其他线程)阻塞还是仅对指定的关键部分阻塞?

如果我想在代码中的不同位置使用互斥体,是否必须创建多个互斥体实例?对于这种情况是否有其他更聪明的解决方案?

c# multithreading locking mutex thread-synchronization
1个回答
2
投票

在任何给定时间,一个 Mutex 实例只能保存在一个位置(/线程)。其他想要获取该互斥体的人都必须等到它被释放。

你可以拥有一个巨大的互斥体供所有人使用,它肯定会串行化访问,但会有很多等待。因此,每个人的一个实例都是安全的,但对性能不利。

理想情况下,您想要保护的每个资源(变量、数据结构等)都有一个互斥体。所以例如将有一个用于数据库访问的数据库,该数据库将在所有与数据库相关的代码位置中使用。

虽然你的例子并不理想,但Web服务和数据库通常都准备好处理多个并发访问,因此应该不需要这种锁定。

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