锁和对象一起封装的危险
在多线程编写中,绝大多数编码风格喜欢把锁和要访问的对象封装在同一个对象,释放对象的时候也释放锁,这样会造成死锁。我们写一个测试例子,我们创建一个锁,把锁锁住,然后再创建一个线程,一直不停的等待锁返回,然后我们把锁释放,这时线程就死锁,代码如下:
定义接口:
type TLockObject = class; TLockTestThread = class; TForm1 = class(TForm) btn1: TButton; mmoLockThreadTest: TMemo; procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private FLockTestThread: TLockTestThread; FLockObject: TLockObject; public { Public declarations } end; TLockTestThread = class(TThread) private FLockObject: TLockObject; public procedure Execute; override; procedure AddLockLog; property LockObject: TLockObject read FLockObject write FLockObject; end; TLockObject = class(TObject) private FLock: TCriticalSection; public constructor Create; virtua