带临界区的先进先出FIFO队列

本文介绍了一种使用临界区确保多线程环境中TObjectQueue安全访问的方法。通过在队列的基本操作如Push、Pop和Peek前后加入EnterCriticalSection和LeaveCriticalSection,实现了线程安全的队列TObjectCriticalSectionQueue。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{建议在多线程中使用或共享缓冲区使用如果不加临界区,TobjectQueue在多线程访问中,

  如果count=0时,调用pop会出现异常 }

  TObjectCriticalSectionQueue = class(TObjectQueue)
    private
      FCriticalSection: TRTLCriticalSection;
    public
      function Push(AObject: TObject): TObject;
      function Pop: TObject;
      function Peek: TObject;
      constructor Create;
      destructor Destroy; override;
  end;
    
constructor TObjectCriticalSectionQueue.Create;
begin
  inherited Create;
  InitializeCriticalSection( FCriticalSection);
end;
destructor TObjectCriticalSectionQueue.Destroy;
begin
  DeleteCriticalSection( FCriticalSection);
  inherited;
end;
function TObjectCriticalSectionQueue.Peek: TObject;
begin
  try
    EnterCriticalSection(FCriticalSection);
    Result := inherited Peek;
  finally
    LeaveCriticalSection(FCriticalSection);
  end;
end;
function TObjectCriticalSectionQueue.Pop: TObject;
begin
  try
    EnterCriticalSection(FCriticalSection);
    Result := inherited Pop;
  finally
    LeaveCriticalSection(FCriticalSection);
  end;
end;
function TObjectCriticalSectionQueue.Push(AObject: TObject): TObject;
begin
  try
    EnterCriticalSection(FCriticalSection);
    Result := inherited Push(AObject);
  finally
    LeaveCriticalSection(FCriticalSection);
  end;
end;

转载于:https://www.cnblogs.com/redprince/archive/2009/12/28/1633801.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值