Delphi · 2024年8月16日

Delphi 多线程安全的计数器使用

计数器很常用,也经常会用到Inc/Dec,但是这个多线程并不安全;

使用的场景如下:

现在假设在一个两个线程的应用中用Inc进行加一操作可能出现的一种情况:

1、  线程A从内存中读出数据(假设为1)

2、  线程B从内存中读出数据(也是1)

3、  线程A对数据加一(现在是2)

4、  线程B对数据加一(现在也是2)

5、  线程A将数据存入内存(现在内存中的数据是2)

6、  线程B也将数据存入内存(现在内存中的数据还是2,但两个线程都对它加了一,应该是3才对,所以这里出现了错误的结果)

方案A:引用单元System.SyncObjs 使用 TInterlocked.Increment/TInterlocked.Decrement

方案B:引用单元Winapi.Windows 使用 InterlockedIncrement/InterlockedDecrement