登录 用户中心() [退出] 后台管理 注册
 

热门搜索:
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: 跨平台的锁 delphi/kylix 版
标题 跨平台的锁 delphi/kylix 版
clq
浏览(1774) 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 单元.

总数:2 页次:1/1 首页 尾页  


发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:




Copyright © 2005-2012 CLQ工作室, All Rights Reserved

CLQ工作室 版权所有