gpt4 book ai didi

multithreading - 互斥锁和线程的问题

转载 作者:行者123 更新时间:2023-12-03 18:08:26 26 4
gpt4 key购买 nike

我处于多线程情况下,我有一个函数,我想一次只从一个线程运行。但是,我不希望以传统方式序列化该函数,而是希望在第一个线程运行该函数时尝试进入该函数的任何线程立即返回。我不希望第二个线程等待第一个线程。

这是我的代码:

function InitMutex(const Name:String; var Handle: THandle):Boolean;
begin
Handle := CreateMutexA(NIL, True, PAnsiChar(Name));
Result := not (GetLastError = ERROR_ALREADY_EXISTS);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
mHandle: THandle;
begin
if not InitMutex(BalloonTipMutex, mHandle) then Exit;


MessageBox(0, 'Executing Code....', '', 0);


ReleaseMutex(mHandle);
CloseHandle(mHandle);
end;

这只是一个具有相同问题的示例,因为我无法使用线程进行测试。

问题是:我第一次点击 button1,出现了消息框,而消息框仍然显示(假设该功能仍在运行)我再次按下 button1,没有显示任何内容(这是应该发生的)但是当我关闭消息框并再次按下按钮时,它什么也没显示。 (该函数应该再次运行,因为它没有运行 :S)

最佳答案

试试这个:

procedure TForm1.Button1Click(Sender: TObject);
var mHandle: THandle;
begin
mHandle := 0;
if InitMutex(BalloonTipMutex, mHandle) then
begin
MessageBox(0, 'Executing Code....', '', 0);
ReleaseMutex(mHandle);
end;
if handle <> 0 then
CloseHandle(mHandle);
end;

你的问题是......即使 CreateMutex 返回错误 ERROR_ALREADY_EXISTS,它确实“打开”了互斥体。因此,当您的第一个函数退出时,互斥量不会被释放,因为您的第二次调用打开了它,但从未关闭过它。因此,当您第三次尝试调用您的函数时,它会失败,这不是因为您的第一次调用使互斥量保持打开状态,而是因为您的第二次调用确实如此。

此外,我认为 InitMutex 应该返回 Result := (Handle <> 0) and not (GetLastError = ERROR_ALREADY_EXISTS)

编辑:附带说明一下,这并不是互斥锁的真正使用方式。使用互斥量的“传统”方法是创建它们,然后让您的线程在您想要执行受互斥量保护的代码时尝试获得它们的所有权。我希望 CreateMutex 比仅仅取得互斥锁的所有权要慢得多,而且该技术可能还有其他一些缺陷。

关于multithreading - 互斥锁和线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429961/

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