zoukankan      html  css  js  c++  java
  • 多线程编程(3) 多线程同步之 CriticalSection(临界区)

    "临界区"(CriticalSection): 当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 让其他也要执行此代码的线程先等等; 这和前面用的 Lock 和 UnLock 差不多; 使用格式如下:

    var CS: TRTLCriticalSection;   {声明一个 TRTLCriticalSection 结构类型变量; 它应该是全局的}
    InitializeCriticalSection(CS); {初始化}
    EnterCriticalSection(CS);      {开始: 轮到我了其他线程走开}
    LeaveCriticalSection(CS);      {结束: 其他线程可以来了}
    DeleteCriticalSection(CS);     {删除: 注意不能过早删除}
    
    //也可用 TryEnterCriticalSection 替代 EnterCriticalSection.
    var
      CS: TRTLCriticalSection;
    
    function MyThreadFun(p: Pointer): DWORD; stdcall;
    var
      i: Integer;
    begin
      EnterCriticalSection(CS);
      for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
      LeaveCriticalSection(CS);
      Result := 0;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ID: DWORD;
    begin
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListBox1.Align := alLeft;
      InitializeCriticalSection(CS);
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      DeleteCriticalSection(CS);
    end;
    
    Delphi 在 SyncObjs 单元给封装了一个 TCriticalSection 类, 用法差不多
    uses SyncObjs;
    
    var
      CS: TCriticalSection;
    
    function MyThreadFun(p: Pointer): DWORD; stdcall;
    var
      i: Integer;
    begin
      CS.Enter;
      for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
      CS.Leave;
      Result := 0;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ID: DWORD;
    begin
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
      CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListBox1.Align := alLeft;
      CS := TCriticalSection.Create;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      CS.Free;
    end;
    
  • 相关阅读:
    使用 JavaScript 将 Silverlight 添加到网页
    网络和通信 Silverlight 中的 HTTP 通信和安全
    在Silverlight中访问Web服务 为 Silverlight 客户端生成服务
    图形三维效果
    关键帧动画
    ajax.dll 与 ajaxpro.dll的用法[摘自网络]
    FlashObject.js去虚框、传参数、获取URL参数
    WEB标准之CSS: 打造自己的重置样式reset.css[转]
    jquery.cookie.js[保存]
    FCKeditor在.net中详细配置[摘自网络]
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940723.html
Copyright © 2011-2022 走看看