在我们的应用程序中,有大量使用win32 HANDLE,使用CreateEvent、SetEvent/ResetEvent,从而执行同步机制。
我的一位同事问我访问事件的句柄是否是线程安全的。
我无法回答,因为 HANDLE 对于任何 GDI 对象都不是线程安全的……
但是由于事件是针对多线程同步的,我无法想象它们不是线程安全的。
你能确认一下吗?
您从 Kernel32 中的函数获得的所有句柄都是线程安全的,除非该函数的 MSDN 库文章明确提到它不是。有一种简单的方法可以从您的代码中看出,这样的句柄是用 CloseHandle() 关闭的。
您对句柄所做的操作不一定是线程安全的,当您调用 SetEvent() 两次但只调用一次 WaitForSingleObject() 时,Windows 将无济于事。这可能是您程序中的线程竞赛,具体取决于您如何使用该事件。
取决于手柄的类型。
同步句柄(如由 CreateEvent 创建的句柄)根据定义是线程安全的。一个文件句柄,当被多个线程同时写入时,不是那么多。