Events 事件还是互斥?
我目前有一个程序一次运行大约20个线程。我对多线程相当陌生,所以我对正确的数据保护有点困惑 目前,我的线程使用事件作为数据锁定和解锁。我选择在关键部分使用它,因为大多数数据只在两个或三个线程之间共享,所以通过停止所有20个线程来防止单个线程读取而另一个线程写入似乎是浪费。我之所以使用Event-over-Mutex,是因为我无法(轻松地)找到一个源代码来清楚地解释互斥体是如何工作以及如何实现互斥体的 我正在使用Win32 API进行多线程。在我当前的设置中,我使用事件锁定数据,因此我的事件在未设置时类似于“DataUnlock”,因为我知道数据正在处理中。设置后,我知道可以处理数据。所以我的临时数据锁看起来像这样Events 事件还是互斥?,events,mutex,critical-section,Events,Mutex,Critical Section,我目前有一个程序一次运行大约20个线程。我对多线程相当陌生,所以我对正确的数据保护有点困惑 目前,我的线程使用事件作为数据锁定和解锁。我选择在关键部分使用它,因为大多数数据只在两个或三个线程之间共享,所以通过停止所有20个线程来防止单个线程读取而另一个线程写入似乎是浪费。我之所以使用Event-over-Mutex,是因为我无法(轻松地)找到一个源代码来清楚地解释互斥体是如何工作以及如何实现互斥体的 我正在使用Win32 API进行多线程。在我当前的设置中,我使用事件锁定数据,因此我的事件在未设
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
我的第一个问题是:当只有两个线程访问数据时,这是否和使用互斥锁一样好(高效)
第二:如果有两个以上的线程等待访问数据,那么在释放数据时是否有可能触发这两个线程(在一个线程到达ResetEvent之前,这两个线程是否都会通过等待)?如果是这样的话,互斥锁也会有同样的问题吗
最后:如果一个互斥是更好的,我将如何实现一个互斥(链接或解释将不胜感激)
谢谢 我不认为事件方法是保护数据的最佳方式 查看并了解互斥锁
EnterCriticalSection()
时阻塞。但是,拥有critical section的线程可以多次连续调用EnterCriticalSection()
。每次调用EnterCriticalSection()
时,应注意调用LeaveCriticalSection()
一次
您的示例将允许所有等待事件的线程处理您的数据。你只能通过数据自己知道是否发生了任何处理。这取决于你,
如何确定已经做了什么以及还需要做什么。如果有许多线程在等待事件,则无法确定获取访问权限的顺序
我建议使用临界截面对象。它重量轻,使用相对容易。请参阅如何使用临界截面对象的示例。我仔细查看了上面的代码片段。该代码段将允许其他线程
…处理数据…
。因此,您的代码片段不能保证在…处理数据…
时互斥。在WaitForSingleObject
解除阻止后的纳秒,但在ResetEvent
之前,另一个线程也解除阻止。这两个线程都很乐意继续执行自由流动的调用序列ResetEvent
,…处理数据…
和SetEvent
,因为这些API是非阻塞的。如果这是您的预期行为,那么您的代码片段就可以了。这都是出于本意。