我有一个公共(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/

10-16 11:10