gpt4 book ai didi

multithreading - 线程安全性读取Interlocked增量值

转载 作者:行者123 更新时间:2023-12-03 19:13:06 24 4
gpt4 key购买 nike

在我的应用程序中,几个线程会增加一些计数器,只有一个读取该值(主线程)。据我所知,如果读取的32位值由双字对齐,则是线程安全的,因此我使用以下代码:

{$A8}
TMyStat = class
private
FCounter: Integer;
public
procedure IncCounter;
property Counter: Integer read FCounter;
...

procedure TMyStat.IncCounter;
begin
InterlockedIncrement(FCounter);
end;

但是我不确定混合 Interlocked函数和直接获取值(value)是否安全。

我应该改用 InterlockedCompareExchange吗?
function TMyStat.GetCounter: Integer;
begin
Result := InterlockedCompareExchange(FCounter, 0, 0);
end;

最佳答案

您可以使用普通阅读。由于FCounter是4对齐的,因此保证读写是原子的。

[不过,这适用于英特尔平台。我真的不知道ARM的表现。我猜想行为是相同的(对齐值的读取是原子的。)

实际上,如果只增加一个计数器并读取它,则甚至不需要InterlockedIncrement。当您读取该值时,您将始终获得前递增值或后递增值。您无法同时兼顾两者。

关于multithreading - 线程安全性读取Interlocked增量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746109/

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