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代码}

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

    当心存在线程饥饿!

    五、信号量

  • 相关阅读:
    洛谷 P1908 逆序对(树状数组解法)
    洛谷 P1908 逆序对(归并排序解法)
    洛谷 P3368 【模板】树状数组 2(区间修改点查询)
    POJ 2833 The Average(优先队列)
    POJ 2255 Tree Recoveryw(二叉树)
    洛谷 P1540 机器翻译(队列)
    POJ 1686 Lazy Math Instructor(栈)
    队列中取最大值操作
    相邻元素差的绝对值都是1,在这样的数组中找目标元素
    双栈队列实现快速获取队列最大值最小值
  • 原文地址:https://www.cnblogs.com/Kernel001/p/8253204.html
Copyright © 2011-2022 走看看