• 多线程的同步和互斥简介


    

            在做项目时,难免会碰到多线程问题,在进行多线程编程时,难免会遇到多线程的互斥与同步操作。

            线程的同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说或者可以这么理解,进程、线程同步,可理解为进程或线程AB一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给AA再继续操作。

            线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。

            线程间的同步方法大体可分为两类:用户模式和内核模式。内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态;而用户模式就是不需要切换到内核态,只在用户态完成操作。
            用户模式下的方法有:临界区;内核模式下的方法有:事件,信号量,互斥。      

    临界区、互斥量、事件、信号量四种方式简介(临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event):

            1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

    临界区包含两个操作原语:
          EnterCriticalSection() 进入临界区
             LeaveCriticalSection() 离开临界区

            2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

    互斥量包含的几个操作原语:
        CreateMutex()     //创建一个互斥
        OpenMutex()        //打开一个互斥
        ReleaseMutex()     //释放互斥
        WaitForMultipleObjects() //等待互斥量对象 

           3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

    信号量包含的几个操作原语:
        CreateSemaphore()   //创建一个信号量
        OpenSemaphore()   //打开一个信号量
        ReleaseSemaphore()  //释放信号量
        WaitForSingleObject()  //等待信号量 

           4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

             CreateEvent()            //创建一个信号量
        OpenEvent()               // 打开一个事件
        SetEvent()                //回置事件
        WaitForSingleObject()       //等待一个事件
        WaitForMultipleObjects()   // 等待多个事件       

    WaitForMultipleObjects //原型
        DWORD nCount,   // 等待句柄数
        CONST HANDLE *lpHandles,  //指向句柄数组
        BOOL bWaitAll,   //是否完全等待标志
        DWORD dwMilliseconds    //等待时间
        )

     

    

     

  • 相关阅读:
    Python中xlrd和xlwt模块使用方法
    python正则表达式中含有变量的写法
    python中取整的几种方法
    python request 获取cookies value值的方法
    MySQL数据库初识
    三次登录验证以及购物车
    常用设计模式学习
    test0805
    生成器和各种推导式
    第一类对象 闭包 迭代器
  • 原文地址:https://www.cnblogs.com/huiz/p/9610680.html
Copyright © 2020-2023  润新知