C++多线程小结(十一)

多线程

同步线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

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


用户模式:原子操作,临界区
内核模式:事件,信号量,互斥量

两种同步方式:

原子操作: 因此在多线程环境中对一个变量进行读写时,我们需要有一种方法能够保证对一个值的递增操作是原子操作——即不可打断性,一个线程在执行原子操作时,其它线程必须等待它完成之后才能开始执行该原子操作。

                                          变量(加载到寄存器---------->寄存器操作改值--------------->实例变量存储改值)

事件(Event主要用于线程间的等待通知,事件能够通知一个操作已经完成。有两种不同类型的事件对象一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程事件可以解决线程间同步问题,因此也能解决互斥问题


三种互斥方式:(待续!)

关键段(CS)执行之前需要独占对一些共享资源的访问权,CS记录关健段句柄(线程所有权) 

键段比作旅馆的房卡,调用EnterCriticalSection()即申请房卡,得到房卡后自己当然是可以多次进出房间的,在你调用LeaveCriticalSection()交出房卡之前,别人自然是无法进入该房间。
图示说明:
C++多线程小结(十一)_第1张图片

看了上面的文字:关键段可以用于线程间的互斥,但不可以用于同步,是不是有了理解呢?

互斥量(Mutex):

信号量(Semaphore):

你可能感兴趣的:(Semaphore,event,mutex,beginthreadex,PulseEvent)