![]() |
登录 用户中心() [退出] 后台管理 注册 |
热门搜索: |
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: 跨平台的锁 delphi/kylix 版 |
标题 | 跨平台的锁 delphi/kylix 版 |
clq |
浏览(1990)
2007-01-18 15:31:47 发表
编辑
关键字: 原来是C++的.要注意的是,windows下对于本线程锁定原来是可重入的(就是本线程可以连续lock多次而不阻塞),这里为了跨平台上保持一致性,都做成了不可重入的. unit UThreadLock; (* * 线程锁类. CLQ修改自C++类. *) interface uses {$IFDEF LINUX} libc, {$ELSE} windows, {$ENDIF} SysUtils, Variants, Classes, Controls ; type TThreadLock = class(TComponent) private {$IFDEF LINUX} lock_id: TRTLCriticalSection; {$ELSE} lock_id:THANDLE; {$ENDIF} is_locked:boolean; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure lock;// procedure unlock;// end; implementation constructor TThreadLock.Create(AOwner: TComponent); begin inherited Create(AOwner); is_locked := false; {$IFDEF LINUX} //pthread_mutex_init(lock_id, 0); InitializeCriticalSection(lock_id); {$ELSE} lock_id := CreateMutex(nil, false, nil); {$ENDIF} end; destructor TThreadLock.Destroy; begin unlock(); {$IFDEF LINUX} //pthread_mutex_destroy(&lock_id); DeleteCriticalSection(lock_id); {$ELSE} CloseHandle(lock_id); {$ENDIF} inherited Destroy; end; procedure TThreadLock.lock(); begin {$IFDEF LINUX} //pthread_mutex_lock(&lock_id); EnterCriticalSection(lock_id); {$ELSE} WaitForSingleObject(lock_id, INFINITE); {$ENDIF} while(is_locked=true)do begin sleep(1000);//其实是死锁了,在linux下是进入不到这里的//windows下应该也只有本线程才能进入[即windows下是可重入的] end; is_locked := true;//要在解锁后赋值 end; procedure TThreadLock.unlock; begin is_locked := false;//要在解锁前赋值 {$IFDEF LINUX} //pthread_mutex_unlock(&lock_id); LeaveCriticalSection(lock_id); {$ELSE} ReleaseMutex(lock_id); {$ENDIF} end; end. |
clq |
2007-1-18 15:35:03 发表
编辑
不太常用,所以比 C++ 的难找 :) 因此我放一个上来. |
clq |
2007-1-18 16:39:31 发表
编辑
晕哪kylix自己加入了一个 QControls,其实应该是 Controls 单元. |
Copyright © 2005-2012 CLQ工作室, All Rights Reserved CLQ工作室 版权所有 |