多线程
同步:线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
互斥:线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
用户模式:原子操作,临界区
内核模式:事件,信号量,互斥量
两种同步方式:
原子操作:因此在多线程环境中对一个变量进行读写时,我们需要有一种方法能够保证对一个值的递增操作是原子操作——即不可打断性,一个线程在执行原子操作时,其它线程必须等待它完成之后才能开始执行该原子操作。
变量(加载到寄存器---------->寄存器操作改值--------------->实例变量存储改值)
事件(Event):主要用于线程间的等待通知,事件能够通知一个操作已经完成。有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。事件可以解决线程间同步问题,因此也能解决互斥问题
三种互斥方式:(待续!)
关键段(CS):执行之前需要独占对一些共享资源的访问权,CS记录关健段句柄(线程所有权)
键段比作旅馆的房卡,调用EnterCriticalSection()即申请房卡,得到房卡后自己当然是可以多次进出房间的,在你调用LeaveCriticalSection()交出房卡之前,别人自然是无法进入该房间。
图示说明:
看了上面的文字:关键段可以用于线程间的互斥,但不可以用于同步,是不是有了理解呢?