gpt4 book ai didi

multithreading - TriticalSection 是否允许多线程访问变量?

转载 作者:行者123 更新时间:2023-12-03 15:45:32 25 4
gpt4 key购买 nike

我想同步线程以访问公共(public)变量。想象一下,我有 N 个线程,每个线程都可以访问 TSyncThreds 类型变量的全局实例。

我可以调用 IncCount、DecCount 方法吗?或者我会遇到并发线程访问对象的同一实例的问题?

我只是同步对 FCcounter 变量的访问...

type
TSyncThreads = class

public
FCounterGuard: TCriticalSection;
FCounter: integer;
FSimpleEvent: TSimpleEvent;

constructor Create();
procedure Wait();
procedure IncCounter();
procedure DecCounter();
end;


var
SyncThread: TSyncThreads;

implementation
uses
Math, Windows, Dialogs;



{ TSyncThreads }

procedure TSyncThreads.DecCounter;
begin
FCounterGuard.Acquire;
Dec(FCounter);
if FCounter = 0 then
FSimpleEvent.SetEvent;
FCounterGuard.Release;
end;

procedure TSyncThreads.IncCounter;
begin
FCounterGuard.Acquire;
Inc(FCounter);
FCounterGuard.Release;
end;

constructor TSyncThreads.Create();
begin
FCounter := 0;
FSimpleEvent := TSimpleEvent.Create;
FCounterGuard := TCriticalSection.Create;
FSimpleEvent.ResetEvent;
end;

procedure TSyncThreads.Wait;
var
ret: TWaitResult;
begin
ret := FSimpleEvent.WaitFor(INFINITE);
end;

最佳答案

是的,你的代码很好,只是对于手头的任务来说有点过分了。您担心多个线程访问同一个对象,但这正是 TCriticalSection 和 TEvent 等同步对象的设计目的。想象一下,如果不能同时访问这些类,那将是多么毫无意义。

您实际上并不需要关键部分来保护对计数器的访问。您可以使用 InterlockedIncrement 和 InterlockedDecrement 进行更轻量级的访问。它们返回变量的先前值,因此如果 InterlockedDecrement 返回 1,那么您就知道是时候设置事件了。

如果计数器有上限,那么您甚至可以避免所有这些代码并改用信号量。或者,您可以为每个线程设置自己的事件,然后使用 WaitForMultipleObjects 等待所有事件;一旦所有线程设置了事件,它将返回,因此您不必同步对任何共享变量的访问。

关于multithreading - TriticalSection 是否允许多线程访问变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702646/

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