我有一些全局var(整数和单一),在启动时初始化,许多线程在只读中访问它们。现在在非常罕见的情况下(当用户更改移动设备的屏幕方向时)我必须更新所有这些globales变量。
在Windows上,我可以使用 TMultiReadExclusiveWriteSynchronizer ,以便线程在读取变量之前执行 beginread ,并且主线程之前执行 beginwrite 更新变量。问题是TMultiReadExclusiveWriteSynchronizer无法在ios / android上运行(它只是其他平台上的TCritical部分)
他们有什么方法可以阻止我可以和平更新所有全局变量的所有线程活动吗?
我可以使用AtomicCmpExchange,但它使我的代码更加繁重(我有超过50个全局变量)。
所以其他选项我不知道在更新全局变量时不关心同时访问,并且稍后要求所有线程重建其内部数据,但是例如,如果我有
var w, h: single;
w := 100.25
h: 50;
然后我做
mainThread:
h := 75.26
Threadn:
createbitmap(w,h);
然后问题是如果threadn读取了h的一半写入值,那么它可能是15258425(据我所知,我不确定),然后我将创建一个将使用所有内存的位图:(
知道我能做什么吗?
编辑/注意
您对在android / ios / windows下工作的TMultiReadExclusiveWriteSynchronizer的实现有何看法:
Var fLock: integer;
procedure TMyMonitor.BeginWrite;
begin
atomicIncrement(fLock, MaxInt div 2);
while AtomicCmpExchange(fLock{Target}, 0{NewValue}, 0{Compareand}) <> MaxInt div 2{OriginalOfTarget} do sleep(1);
end;
procedure TMyMonitor.EndWrite;
begin
atomicDecrement(fLock, MaxInt div 2);
end;
procedure TMyMonitor.BeginRead;
begin
while atomicIncrement(fLock{Target}) >= Maxint div 2{NewValueOfTarget} do begin
atomicDecrement(fLock);
while AtomicCmpExchange(fLock{Target}, 0{NewValue}, 0{Compareand}) >= Maxint div 2{OriginalOfTarget} do sleep(1);
end;
end;
procedure TMyMonitor.EndRead;
begin
atomicdecrement(fLock);
end;