Events 事件还是互斥?

Events 事件还是互斥?,events,mutex,critical-section,Events,Mutex,Critical Section,我目前有一个程序一次运行大约20个线程。我对多线程相当陌生,所以我对正确的数据保护有点困惑 目前,我的线程使用事件作为数据锁定和解锁。我选择在关键部分使用它,因为大多数数据只在两个或三个线程之间共享,所以通过停止所有20个线程来防止单个线程读取而另一个线程写入似乎是浪费。我之所以使用Event-over-Mutex,是因为我无法(轻松地)找到一个源代码来清楚地解释互斥体是如何工作以及如何实现互斥体的 我正在使用Win32 API进行多线程。在我当前的设置中,我使用事件锁定数据,因此我的事件在未设

我目前有一个程序一次运行大约20个线程。我对多线程相当陌生,所以我对正确的数据保护有点困惑

目前,我的线程使用事件作为数据锁定和解锁。我选择在关键部分使用它,因为大多数数据只在两个或三个线程之间共享,所以通过停止所有20个线程来防止单个线程读取而另一个线程写入似乎是浪费。我之所以使用Event-over-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
我的第一个问题是:当只有两个线程访问数据时,这是否和使用互斥锁一样好(高效)

第二:如果有两个以上的线程等待访问数据,那么在释放数据时是否有可能触发这两个线程(在一个线程到达ResetEvent之前,这两个线程是否都会通过等待)?如果是这样的话,互斥锁也会有同样的问题吗

最后:如果一个互斥是更好的,我将如何实现一个互斥(链接或解释将不胜感激)


谢谢

我不认为事件方法是保护数据的最佳方式

查看并了解互斥锁

  • 其中一个线程必须创建互斥锁。返回互斥对象的句柄。您可以将句柄作为参数传递给处理数据的线程
  • 使用等待互斥锁,然后处理数据。通过调用来释放互斥锁。释放互斥锁后,下一个等待函数将获得互斥锁
  • 如果数据由多个进程的线程访问,则必须使用命名互斥体
  • 查看以了解关键部分同步

    如果你想拥有

  • 必须通过调用来创建关键部分
  • 在处理数据之前,请在所有位置使用
  • 释放临界截面释放对象。在处理完数据后使用此调用
  • 关键部分只能由所属线程输入。一旦一个线程获得了critical section对象,其他线程就无法访问您的数据。其他线程将在调用
    EnterCriticalSection()
    时阻塞。但是,拥有critical section的线程可以多次连续调用
    EnterCriticalSection()
    。每次调用
    EnterCriticalSection()
    时,应注意调用
    LeaveCriticalSection()
    一次

    您的示例将允许所有等待事件的线程处理您的数据。你只能通过数据自己知道是否发生了任何处理。这取决于你, 如何确定已经做了什么以及还需要做什么。如果有许多线程在等待事件,则无法确定获取访问权限的顺序



    我建议使用临界截面对象。它重量轻,使用相对容易。请参阅如何使用临界截面对象的示例。

    我仔细查看了上面的代码片段。该代码段将允许其他线程
    …处理数据…
    。因此,您的代码片段不能保证在
    …处理数据…
    时互斥。在
    WaitForSingleObject
    解除阻止后的纳秒,但在
    ResetEvent
    之前,另一个线程也解除阻止。这两个线程都很乐意继续执行自由流动的调用序列
    ResetEvent
    …处理数据…
    SetEvent
    ,因为这些API是非阻塞的。如果这是您的预期行为,那么您的代码片段就可以了。这都是出于本意。