我目前有一个程序一次运行大约 20 个线程。我对多线程相当陌生,所以我对正确的数据保护有点困惑。
目前,我的线程使用事件作为数据锁定和解锁。我选择在关键部分使用它,因为大多数数据仅在两个或三个线程之间共享,因此通过停止所有 20 个线程来防止单个线程读取而一个线程写入似乎很浪费。我使用 Event over Mutex 仅仅是因为我无法(轻松地)找到一个清楚地解释 Mutex 如何工作以及如何实现的源。
我正在为我的多线程使用 Win32 API。在我当前的设置中,我使用事件来锁定数据,因此我的事件将类似于“DataUnlock” 当未设置时,我知道正在处理数据。设置后,我知道可以处理数据。所以我的临时数据锁看起来像这样。
WaitForSingleObject( DataUnlock,INFINITE ); //Wait until the Data is free
ResetEvent(DataUnlock); //Signal that the data is being worked on
...work on Data...
SetEvent(DataUnlock); //Signal that the data is free to use
我的第一个问题是:当只有两个线程访问数据时,这是否与使用 Mutex 一样好(高效)?
第二:如果有两个以上的线程等待访问数据,是否有可能在数据被释放时都被触发(在一个到达 ResetEvent 之前两者都会通过等待)?如果是这样,互斥锁会不会有同样的问题?
最后:如果互斥锁更可取,我将如何实现一个(非常感谢链接或解释)?
谢谢!