大家都要好好学习delphi XE线程同步对象单元System.SyncObjs

System.SyncObjs.pas;

一、不是存pascal就直接汇编

二、支持MSWINDOWS、POSIX和MACOS全平台

三、常用类型(异常类就不列了)

1、TCriticalSectionHelper = record helper for TRTLCriticalSection //运行时临界区助手 MSWINDOWS

2、TConditionVariableHelper = record helper for TRTLConditionVariable //运行时条件变量助手 MSWINDOWS

3、TWaitResult = System.Types.TWaitResult;

其中:TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError, wrIOCompletion);

附带说说:

System.Types.TMultiWaitEvent :抽象基类在System.Classes中完全实现,并由IAsyncResult.GetAsyncWaitEvent返回。此类允许使用WaitForAll()和WaitForAny()阻塞任意数量的这些事件。虽然这个类可以通过创建子类来实现,但是将由System.Classes提供。任何创建替代实现的尝试都必须遵循此抽象虚拟方法中的“约定”。即在System.Classes的实现代码中完成: System.Classes.TMultiWaitEventImpl = class(TMultiWaitEvent) :多线程等待的实现类 :在自动加锁的模式下等到线程执行完毕的信号灯,否则按照指定超时时间等待下去,执行完毕自动解锁。

System.Types.IAsyncResult : 从各种“BeginXXX”方法返回的接口,用以提供代码的异步执行。其实现:

System.Classes.TBaseAsyncResult ://:异步执行结果的基类,且实现了基本的异步执行

4、TSynchroObject = class(TObject) //同步对象类

5、THandleObjectArray = array of THandleObject; //同步对象类的数组

6、THandleObject = class(TSynchroObject) //带句柄的同步对象类,句柄(比如窗体的对象、带有Sender:TObject的方法等)

7、TEvent = class(THandleObject) //事件的同步对象类,用以控制线程的执行,当其执行完毕事时向线程外部发信号指示

8、TSimpleEvent = class(TEvent); //事件的同步对象类的别名

9、TMutex = class(THandleObject) //某个排他性的带句柄的同步对象类,即某个互斥锁句柄的同步对象类

10、TSemaphore = class(THandleObject) //信号标志等待结果的同步对象类 :

11、TCriticalSection = class(TSynchroObject) //临界区同步对象类 :当多线程同时访问(特别是写)变量或其它类型时让它们排好队

12、TCriticalSection = class(TSynchroObject) //临界区的同步对象类

13、TConditionVariableMutex = class(TSynchroObject) //互斥锁句柄是变量时的同步对象类

14、TConditionVariableCS = class(TSynchroObject) //运行时临界区是变量时的同步对象类

15、TConditionVariableCS = class(TSynchroObject) //运行时临界区是变量时的同步对象类

16、TSpinWait = record //多线程的自旋等待记录:TSpinWait为spin(线程内自旋:线程内部的循环)或busy waiting(线程这处于繁忙时的等待)实现了指数退避算法如下:如果CPUCount>1,则前10个(YieldThreshold)自旋周期(对SpinCycle的调用)将使用基数2从4开始以指数方式增加自旋计数。10个周期后该行为恢复为CPUCount=1时的相同行为。如果CPUCount=1那么它将每20个模周期休眠(TThread.sleep)1毫秒,每模休眠0毫秒5个周期。所有其他的循环都简单地产生(TThread.yield)。此类型参考.NET 4.0中可用的类似类型System.Threading.SpinWait建模。其中类方法class function SpinUntil(const ACondition: TFunc<Boolean>; Timeout: Cardinal): Boolean;以多线程内部自旋的方式在规定的时间内等待一个函数执行完毕等非常有用

17、TSpinLock = record //多线程不可重入的自旋锁记录:TSpinLock实现了一个非常简单的不可重入自旋锁。此锁不会使用同步对象。相反,它选择使用与上面类似的技术来燃烧一些额外的CPU等待周期:TSpinWait类型。如果锁保持的时间长度为相对较少的等待周期,线程切换开销通常远远超过被简单的旋转等待燃烧的等待周期(换句话说,如果你预计你执行的线程的等待时间较长,才使用自旋锁) 。这通常只适用于多核或SMP(对称多处理器)情况。不过,考虑到这种情况,在当前线程的时间段内,CPU将被让步而提供出来而不是实际地忙于等待。由于此锁是不可重入的,因此,如果,启用了threadID跟踪,从同一线程再次调用Enter将引发异常,否则,将导致死锁。Exit上的PublishNow参数指示是否应使用完整的内存界限来确保其他线程会立即看到出口。在这种情况下,以牺牲一点为代价,锁的公平性更好展现。此类型参考.NET 4.0中类似类型System.Threading.SpinLock建模。

18、TLightweightEvent = class(TSynchroObject) //预计线程等待时间很少的同步对象类:TLightweightEvent仅用于来自System.SyncObjs.TInterlocked类和系统自带的内置的system.TMonitor。与上面的TSpinLock类似,TLightweightEvent.WaitFor在完全阻塞调用线程之前,在自旋循环中,更愿意尝试并消耗一些CPU等待周期 。这个类应该真正用于信号阻塞比相对较小,换言之,TLightweightEvent.WaitFor预计花费的时间相对较短(就CPU周期而言,不是绝对时间)的场景。否则,当内部自旋计数耗尽并最终阻塞时,性能可能略有下降。此类型参考.NET 4.0中的类似如System.Threading.ManualResetEventSlim建模。

19、TLightweightSemaphore = class(TSynchroObject) //预计线程等待时间很少的使用内部原子锁的同步对象类:它只用原子操作实现一个较少信号量的同步,原型来自TInterlocked类和内置的TMonitor。类似于上面的TSpinLock和TLightweightEvent,TLightweightSemaphore.WaitFor在执行完整的阻塞操作。同样,像上面的TLightweightEvent一样,TLightweightSemaphore应该在以下场景中使用:信号量计数定期保持>0。这将确保对WaitFor的调用很少被阻塞。相比之下,下面的TSemaphore类在信号量计数通常为0,该类的性能可能会略低于TSemaphore类。此类型参考.NET4.0中类似System.Threading.SemaphoreSlim建模。

20、TCountdownEvent = class(TSynchroObject) //多线程计数减少事件下管理当前计数的同步对象类:是个同步对象TSynchroObject,其行为类似于“手动重置信号量”(TEvent.ResetEvent),它内部其实为TCountdownEvent.Reset。当计数为零时,它才被发出信号。一旦计数为零,唯一的方法就是调用重置方法之一的“取消”事件unsignal。只有当前计数大于0时才能调用AddCount增加计数。TryAddCount:如果计数大于0且计数已添加,则返回true;否则,如果计数=0或已添加,则返回false。此类型是根据.NET 4.0中类似类型System.Threading.CountdownEvent建模的。

21、 TBitOffset = 0..31;//Bit偏移量范围

22、TInterlocked = class sealed //多线程内部加锁的密封类:TInterlocked实现各种常见的原子操作,以确保:在“多线程”或“多核”运行环境中,当修改那些可共享访问的变量时的安全性。TInterlocked类无需实例化,内部都是类方法,都是“静态的”,就跟一个函数的调用方法一样。非常有用!

四、线程同步对象等待结果的常量(具体使用时:请注意命名空间)

const

wrSignaled = System.Types.TWaitResult.wrSignaled; //:等待信号灯亮:即线程内部Excute完毕

wrTimeout = System.Types.TWaitResult.wrTimeout; //:按指定的时间等待,直到超时

wrAbandoned = System.Types.TWaitResult.wrAbandoned; //:线程的等待被遗弃,即:线程被操作系统作废了,未执行

wrError = System.Types.TWaitResult.wrError; //:线程等待过程中发生错误

wrIOCompletion = System.Types.TWaitResult.wrIOCompletion; //:等待线程IO输入输出完成

它怎么用:一般配合上述类中的函数 function WaitFor(Timeout: Cardinal = INFINITE): TWaitResult; overload; override; 来使用

五、线程、多线程、同步执行、异步执行、并行相关内容参考

https://blog.csdn.net/pulledup/article/details/105617706