TMutex delphi的WaitFor函数与win32 API中的等价函数之间的区别

时间:2010-05-27 23:53:33

标签: delphi

delphi的文档说明TMutex和其他同步对象的WaitFor函数一直等到对象的句柄发出信号。但是这个函数也保证了调用者对象的所有权吗?

2 个答案:

答案 0 :(得分:3)

是的,TMutex的调用线程拥有互斥锁;该类只是OS互斥对象的包装器。通过检查 SyncObjs.pas 来了解自己。

其他同步对象(例如TCriticalSection)也是如此。我在这样一个对象上调用Release方法的任何线程,而不仅仅是调用Acquire的线程。

答案 1 :(得分:2)

TMutex.AcquireTHandleObjects.WaitFor的包装,它会根据WaitForSingleObject构造函数参数调用CoWaitForMultipleHandlesUseCOMWait
如果您在应用程序中使用STA COM对象,这可能非常重要(例如,您可能不知道,dbGO / ADO是COM)并且您不想死锁。 /> 在主线程中输入长/无限等待仍然是一个危险的想法,因为正确处理通过TThread.Synchronize进行的调用的唯一方法是TThread.WaitFor并且您可能会停止(或死锁)您的工作线程如果您使用SyncObjs对象或WinAPI等待函数 在商业项目中,我使用自定义等待方法,基于来自THandleObjects.WaitForTThread.WaitFor的想法以及可选的可警告等待(适用于异步IO但不可替代的)中止长时间等待。)

编辑:关于COM / OLE的进一步说明:

COM / OLE模型(例如ADO)可以使用不同的线程模型:STA(单线程)和MTA(多线程或自由线程)。
根据定义,主GUI线程初始化为STA,这意味着COM对象可以使用窗口消息进行异步消息传递(特别是从其他线程调用时,可以安全地同步)。 AFAIK,他们也可以使用APC程序 CoWaitForMultipleHandles函数存在的理由很充分 - 请参阅它在SyncObjs.pas THandleObject.WaitFor中的使用 - 根据线程模型,它可以处理内部COM消息,同时阻塞等待句柄。