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
方法并在那里锁定互斥体,会发生什么?
互斥锁是对整个类(以及其他线程)阻塞还是仅对指定的关键部分阻塞?
如果我想在代码中的不同位置使用互斥体,是否必须创建多个互斥体实例?对于这种情况是否有其他更聪明的解决方案?
在任何给定时间,一个 Mutex 实例只能保存在一个位置(/线程)。其他想要获取该互斥体的人都必须等到它被释放。
你可以拥有一个巨大的互斥体供所有人使用,它肯定会串行化访问,但会有很多等待。因此,每个人的一个实例都是安全的,但对性能不利。
理想情况下,您想要保护的每个资源(变量、数据结构等)都有一个互斥体。所以例如将有一个用于数据库访问的数据库,该数据库将在所有与数据库相关的代码位置中使用。
虽然你的例子并不理想,但Web服务和数据库通常都准备好处理多个并发访问,因此应该不需要这种锁定。