我声明了两个全局变量:
var
gIsRunning: Boolean = False;
gLogCounter: Integer = 0;
这些变量只在主线程中编写,而在其他线程中读取。在这种情况下,这些变量是线程安全的吗?
我声明了两个全局变量:
var
gIsRunning: Boolean = False;
gLogCounter: Integer = 0;
这些变量只在主线程中编写,而在其他线程中读取。在这种情况下,这些变量是线程安全的吗?
var
LastGoodValueTested : Integer
procedure TestValue(aiValue : Integer);
begin
if ValueGood(aiValue) then
LastGoodValue := aiValue
end;
在这里,你可以从多个线程中调用TestValue例程,并且不会破坏LastGoodValueTested变量。然而,可能出现写入变量的值不是最后一个值的情况,这取决于ValueGood(aiValue)和赋值之间是否发生了线程上下文切换。因此,根据需要,这可能或可能不可接受。
现在,
var
gLogCounter: Integer = 0;
procedure Log(S : string);
begin
gLogCounter := gLogCounter + 1;
end;
在这里,您实际上可以使计数器变得不正确,因为它不是一元操作。您首先读取该变量。 然后将其加1。 然后您将其保存回去。在线程执行这些操作的中间可能会发生上下文切换。因此,这种情况需要同步。
在这种情况下,可以重写为
procedure Log(S : string);
begin
InterlockedIncrement(gLogCounter);
end;
我认为这比使用临界区稍微快一些,但我不确定。
InitializeCriticalSection
、EnterCriticalSection
和LeaveCriticalSection
函数来访问这些变量。请注意保留HTML标记。//declaration of your global variables
var
MyCriticalSection: TRTLCriticalSection;
gIsRunning: Boolean;
gLogCounter: Integer;
//before the threads starts
InitializeCriticalSection(MyCriticalSection);
//Now in your thread
EnterCriticalSection(MyCriticalSection);
//Here you can make changes to your variables.
gIsRunning:=True;
inc(gLogCounter);
//End of protected block
LeaveCriticalSection(MyCriticalSection);