Delphi多线程开发注意事项

Q1: 多线程中需避免多个线程同时向全局变量进行写入操作,导致访问冲突问题。

A1: 可以通过使用加锁机制(比如:临界区、互斥、信号量)解决此问题。

Q2:多线程中对于结构体和CLASS类型的全局变量是需要进行加临界区机制来实现数据同步

A2: 注意:临界区只有在所有的线程都使用它来访问全局内存时才起作用,如果有线程直接调用内存,而不通过临界区,也会造成同时访问的问题。临界区主要是为实现线程之间同步的,但是使用的时候要注意,一定要在使用临界区同步的线程之外建立该临界区(一般在主线程中定义临界区并初始化临界区)。临界区是一个进程里的所有线程同步的最好办法,它不是系统级的,只是进程级的,也就是说它可能利 用进程内的一些标志来保证该进程内的线程同步,据Richter 说是一个记数循环。 临界区只能在同一进程内使用。

Q3:多线程模式下ADOQUERY在查询、执行更新或删除操作时有会报错。

A3:现在的解决办法是每个线程对象里创建一个ADOCONNECTION,线程对象内的所ADOQuery都连这个ADOConnection,这样就没有问题了。另外ADOQUERY的OPEN和EXECUTE方法都需要加临界区进行保护。

Q4:多线程模式下写日志(写到文件里)时报错,导致转换机宕机

A4:写日志时通过加锁(临界区)的方式来解决此问题

Q5:多线程模式下使用TLIST导致操作数据时,发现数据不同步以及会报错现象。

A5:更换为TThreadList就正常。

Q6: 多线程模式下使用TStringList导致操作数据时,发现数据不同步以及会报错现象。

A6:继承TStringList派生出一个新类型,对派生类的方法(Add, AddObject, Clear, Delete, Find, Insert等等)进行重载,并对每个方法进行加临界区处理。