multithreading - delphi - 类静态方法,多线程应用程序中的静态变量

标签 multithreading delphi class methods static

我对 delphi XE2 比较陌生,我想知道一些事情,如果我喜欢这段代码的话

TSomeClass=class
strict private
class var
   FCounter:integer;
public
   class procedure SomeProcedure();static
end;

implementation
class procedure SomeProcedure()
begin
  inc(FCounter);
end;

initialization
begin
   FCounter:=0;
end;

finalization
begin
  FCounter:=0;
end;

据我了解,SomeProcedure() 将静态存储在内存中,并且是单个实例,

我的问题

  1. 如果 TSomeClass 被多个线程访问,TSomeClass 线程安全与否?还是会造成线程重叠?
  2. 如果是,每个线程都需要临界区吗?或那种方法的另一种方法......
  3. 如果两个不同的线程访问这个方法,FCounter 怎么样? FCounter 将从最后一个值开始连续计数还是从零开始计数不同值的不同线程?

最佳答案

不同的方法调用之间没有同步。如果方法,无论它们是什么类型的方法,访问共享数据,则可能需要同步。

它们的方法是类方法还是实例方法、静态方法还是动态方法等都没有任何区别。重要的是是否有多个线程正在访问共享对象。

If two different thread accessed this method, how about FCounter? FCounter will count sequential from last value or different thread with different value start from zero?

在您的代码中,FCounter 是一个类变量。变量只有一个实例,在所有线程之间共享。类变量只是一个全局变量,仅此而已。

您的代码会修改该共享变量。如所写,代码存在数据竞争。您可以通过同步来解决它。例如,使用 InterlockedIncrement 而不是 inc

class procedure SomeProcedure;
begin  
  InterlockedIncrement(FCounter); 
end;

对于更复杂的对象,您将使用关键部分进行序列化。

关于multithreading - delphi - 类静态方法,多线程应用程序中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16706013/

相关文章:

Java 多线程访问静态变量

c# - 我的多线程创建或覆盖额外/现有线程

delphi - 在Delphi中生成三个随机字符

delphi - Delphi 菜单项和工具栏按钮的无版权资源图像集合

java - 在方法/函数中使用类变量会创建对源的引用而不是重复它?

multithreading - Akka 中使用 Actor 模型的读写器锁

c++ - 在 C/C++ 中生成线程的跨平台方式?

Delphi 匿名方法 - 优点和缺点。在 Delphi 中使用闭包(匿名方法)的良好实践

javascript - JS 文件中的函数不是由 index.js click evt 触发的

javascript - javascript类中的静态异步函数