gpt4 book ai didi

delphi - 如何使用互斥体保护公共(public)资源?

转载 作者:行者123 更新时间:2023-12-03 14:55:10 25 4
gpt4 key购买 nike

我有一个公共(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 的末尾添加了一个 GUID。

关于delphi - 如何使用互斥体保护公共(public)资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2470921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com