readCreateError, [SysErrorMessage(GetLastError)]);
end;
虽然这个构造函数没有多少代码,但却可以算是最重要的一个成员,因为线程就是在这里被创建的。 在通过Inherited调用TObject.Create后,第一句就是调用一个过程:AddThread,其源码如下:
procedure AddThread; begin InterlockedIncrement(ThreadCount); end;
同样有一个对应的RemoveThread: procedure RemoveThread; begin InterlockedDecrement(ThreadCount); end;
它们的功能很简单,就是通过增减一个全局变量来统计进程中的线程数。只是这里用于增减变量的并不是常用的Inc/Dec过程,而是用了InterlockedIncrement/InterlockedDecrement这一对过程,它们实现的功能完全一样,都是对变量加一或减一。但它们有一个最大的区别,那就是InterlockedIncrement/InterlockedDecrement是线程安全的。即它们在多线程下能保证执行结果正确,而Inc/Dec不能。或者按操作系统理论中的术语来说,这是一对“原语”操作。 以加一为例来说明二者实现细节上的不同: 一般来说,对内存数据加一的操作分解以后有三个步骤: 1、从内存中读出数据 2、数据加一 3、存入内存 现在假设在一个两个线程的应用中用Inc进行加一操作可能出现的一种情况: 1、线程A从内存中读出数据(假设为3) 2、线程B从内存中读出数据(也是3) 3、线程A对数据加一(现在是4) 4、线程B上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
|