3

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

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

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

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

你能确认一下吗?

4

2 回答 2

2

您从 Kernel32 中的函数获得的所有句柄都是线程安全的,除非该函数的 MSDN 库文章明确提到它不是。有一种简单的方法可以从您的代码中看出,这样的句柄是用 CloseHandle() 关闭的。

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

于 2012-08-31T11:16:41.427 回答
1

取决于手柄的类型。

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

于 2012-08-31T09:46:41.787 回答