• 线程同步之同步中问题 学习总结


    ————— 线程同步的几种技术 ——————

    一、原子锁 ATOM

    二、临界区 CriticalSection

    临界区 可以保证线程同步

    { 以下是伪代码:  在做个之前要引入Windows 单元 ,这是Delphi封装Windows下 VC++ 所有API }
    CreateCriticalSection CS;
    InitCriticalSection(CS);
    
    {--线程1执行代码--}
    var
       I: Integer;
    for I :=  0 to 10 do
    begin
        EnterCriticalSection(CS); 
        Memo1.add('a');
        Memo1.add('a');
        LeaveCriticalSection(CS);
        //Sleep(500); //睡0.5 s 作用: 防止线程2饥饿  一旦被抢去线程1就没有机会执行了,线程2 中的同样道理
    end;
    {--线程1执行的代码--}
    
    {--线程2执行代码--}
    var
       I: Integer;
    for I :=  0 to 10 do
    begin
        EnterCriticalSection(CS);
        Memo1.add('b');
        LeaveCriticalSection(CS);
        // Sleep(500); 
    end;
    {--线程2执行的代码--}
    
    DeleteCriticalSection(CS)

    上面的代码不重要,理解其中的思想! 

    临界区存在的问题!

       线程执行的过程是有条不紊的执行,但是并不能每次都能很好的控制哪个线程先执行!这就造成了线程之间的饥饿竞争计算机系统资源!所以这个现象应该尽量避免!

      当心存在线程饥饿!

    三、事件 Event

      

    var
        hEvent1,hEvent2:THandle;
    hEvent1:= CreateEvent(参数……);
    hEvent2:= CreateEvent(参数……);
    
    {线程1代码}
    var
      I: Integer;
    for I:= 0 to 10 do
    begin
       WaitSingleForObject(hEvent1,INFINITE{等待时间,这里是
       Windows下设定的无限时间});{-->一旦通过这里的阻塞,就会设置hEvent1为无信号状态,其他线程就没有执行的权限(或者其他线程就
    不得执行)}
    
      {--线程1执行代码--}   
      SetEvent(hEvent2);//设置事件2 有信号,此时线程2执行
    
    end;    
    {线程1代码}
    {线程2代码}
    var
      I: Integer;
    for I:= 0 to 10 do
    begin
       WaitSingleForObject(hEvent2,INFINITE{等待时间,这里是
       Windows下设定的无限时间});{-->一旦通过这里的阻塞,就会设置hEvent1为无信号状态,其他线程就没有执行的权限(或者其他线程就
    不得执行)}
     
      {--线程2执行代码--}
      SetEvent(hEvent1);//设置事件1 有信号,此时线程1执行
    
    end;
    {线程2代码}

    创建两个事件就可以有条不紊的执行,而且还可以控制线程执行的顺序,这样还避免了线程饥饿问题

    四、互斥锁

    var
       hMutex:THandle;
    
     hMutex := CreateMutex(参数……);
    {线程1代码}
      WaitforSingleObject(hMutex,INFINITE);
      {线程1执行代码} 
      ReleaseMutex(hMutex);    
    {线程1代码}
    
    {线程2代码}
      WaitforSingleObject(hMutex,INFINITE);
      {线程1执行代码} 
      ReleaseMutex(hMutex); 
    {线程2代码}

    互斥锁方法与其他方法相比的好吃就是 互斥锁可以跨进程之间线程同步

    当心存在线程饥饿!

    五、信号量

  • 相关阅读:
    MYSQL 注射精华
    MySQL数据库安全配置
    linux命令
    python异常处理、反射、socket
    random、面向对象编程
    序列化、常用模块以及面向对象基础
    python 装饰器、递归原理、模块导入方式
    python递归、collections系列以及文件操作进阶
    python基础
    python简介
  • 原文地址:https://www.cnblogs.com/Kernel001/p/8253204.html
Copyright © 2020-2023  润新知