win32句柄和多线程

时间:2012-08-31 09:32:40

标签: c++ winapi events handle

在我们的应用程序中,使用CreateEvent,SetEvent / ResetEvent大量使用win32 HANDLE,以便执行同步机制。

我的一位同事问我访问HANDLEs事件是否是线程安全的。

我无法回答,因为HANDLEs对任何GDI对象都不是线程安全的......

但由于事件的目标是多线程同步,我无法想象它们不是线程安全的。

你能确认吗?

2 个答案:

答案 0 :(得分:2)

从Kernel32中的函数获得的所有句柄都是线程安全的,除非该函数的MSDN Library文章没有明确提及它。从代码中可以很容易地判断,这样的句柄是用CloseHandle()关闭的。

使用句柄执行的操作可能不一定是线程安全的,当您调用SetEvent()两次但WaitForSingleObject()只调用一次时Windows不会帮助。这可能是您程序中的线程竞赛,具体取决于您如何使用该事件。

答案 1 :(得分:1)

取决于手柄的类型。

根据定义,同步句柄(类似于CreateEvent创建的句柄)是线程安全的。 文件句柄,当由多个线程同时写入时,不是那么多。