zoukankan      html  css  js  c++  java
  • 线程同步之同步中问题 学习总结

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

    一、原子锁 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代码}

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

    当心存在线程饥饿!

    五、信号量

  • 相关阅读:
    MVC的各个部分都有那些技术来实现?如何实现?
    JRE、JDK、JVM 及 JIT 之间有什么不同
    什么是竞态条件?举例说明
    【Spring】No converter found for return value of type: class java.util.ArrayList
    【Spring】org.springframework.web.context.ContextLoaderListen 报错
    【Spring】The matching wildcard is strict……
    【MySQL】目录、文件权限问题
    线程和锁
    【Git】Found a swap file by the name ".git/.MERGE_MSG.swp"
    【Maven】Mac 使用 zsh 后 mvn 命令就无效
  • 原文地址:https://www.cnblogs.com/Kernel001/p/8253204.html
Copyright © 2011-2022 走看看