在我们的应用程序中,使用CreateEvent,SetEvent / ResetEvent大量使用win32 HANDLE,以便执行同步机制。
我的一位同事问我访问HANDLEs事件是否是线程安全的。
我无法回答,因为HANDLEs对任何GDI对象都不是线程安全的......
但由于事件的目标是多线程同步,我无法想象它们不是线程安全的。
你能确认吗?
答案 0 :(得分:2)
从Kernel32中的函数获得的所有句柄都是线程安全的,除非该函数的MSDN Library文章没有明确提及它。从代码中可以很容易地判断,这样的句柄是用CloseHandle()关闭的。
使用句柄执行的操作可能不一定是线程安全的,当您调用SetEvent()两次但WaitForSingleObject()只调用一次时Windows不会帮助。这可能是您程序中的线程竞赛,具体取决于您如何使用该事件。
答案 1 :(得分:1)
取决于手柄的类型。
根据定义,同步句柄(类似于CreateEvent创建的句柄)是线程安全的。 文件句柄,当由多个线程同时写入时,不是那么多。