我有一个公共(public)资源,我希望任何时候我的应用程序(或它的COM API)只有1个实例,并且只有1个实例可以访问。我试图使用互斥锁来保护此资源,但是当主机dotnet应用程序的多个线程尝试访问COM对象时,互斥锁似乎没有被释放。这是我用来保护资源的代码。
repeat
Mutex := CreateMutex(nil, True, PChar('Connections'));
until (Mutex <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS);
try
//use resource here!
finally
CloseHandle(Mutex);
end;
如果我同时运行这些线程,则第一个线程将通过(显然,它是创建互斥锁的第一个),但随后的线程将陷入重复循环中。如果我每隔5秒运行一次线程,则一切正常。
我怀疑我在这里没有正确使用互斥锁,但是我发现很少有关于如何执行此操作的文档。
有任何想法吗?
最佳答案
您使用的互斥体错误。您应该等待它并释放它,而不要不断地重新创建它。
在初始化期间:
Mutex := CreateMutex(nil, False, 'Connections');
if Mutex = 0 then
RaiseLastOSError;
当您想访问资源时
if WaitForSingleObject(Mutex, INFINITE) <> WAIT_OBJECT_0 then
RaiseLastOSError;
try
// Use resource here
finally
ReleaseMutex(Mutex)
end;
在完成期间
CloseHandle(Mutex);
另外,由于互斥锁是全局的,因此您应该选择比“连接”更独特的名称。我们在我们的末尾添加了一个GUID。
关于delphi - 如何使用互斥锁保护公共(public)资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2470921/