承接上一篇:https://blog.youkuaiyun.com/uVarAndMethod/article/details/90364461
互斥:
当多个线程访问同一个全局变量,或者同一个资源(比如打印机)的时候,需要进行线程间的互斥操作
来保证访问的安全性.
临界区、互斥体、事件和信号量都可以实现线程互斥.但如果仅仅需要实现互斥功能,推荐前两种:
初始化 进入互斥区域 离开互斥区域 销毁
临界区 Initialize-CriticalSection Enter-CriticalSection Leave-CriticalSection DeleteCriticalSection
互斥体 CreateMutex WaitForSingleObject ReleaseMutex CloseHandle
两者的区别:
1、临界区只能用于进程内的线程互斥,性能较好.
2、互斥体属于内核对象,可以用于进程间的线程互斥,性能较差.
3、线程在没有正常退出互斥区而意外终结时,互斥体可以复位,但临界区不行.
线程同步:
当有多个线程同时执行时,可能需要线程按照一定的顺序执行,比如:线程A负责将要处理的数据读取到内存中,而线程B
负责分析这些数据,此时,应该是线程A执行完毕再执行线程B才有意义,这个时候就需要进行线程的同步控制。
可以用于线程同步控制的对象:事件和信号量
事件:
创建 使事件进入触发状态 使事件进入未触发状态 销毁
CreateEvent SetEvent ResetEvent CloseHandle
信号量:
创建 递减计数 递增计数 销毁
CreateSemaphore WaitForSingleObject ReleaseSemaphore CloseHandle
两者的区别:
1、都是内核对象,使用完毕后应该关闭句柄.
2、信号量可以用于相当复杂的线程同步控制.
用信号量+临界区做的一个类似抢红包程序(同步+互斥),该程序主要理解同步+互斥: https://download.youkuaiyun.com/download/uvarandmethod/11189376