线程同步
OS理解,处理该thread的时间到了,即使没有处理完,也是马上走人(当机立断),但是会打标记,一会儿来了,继续做(持之以恒)
1.原子锁(原子锁只能对运算符进行操作,可以通过flag简易实现)
产生原因
多个线程对一个数据进行原子操作,就会导致结果丢失。比如 -- 或者 ++
//原子锁函数,在任何一个时间只能有一个线程访问
InterlockedXXX();
2.互斥
产生原因
多线程下面代码或者资源的使用
特点
在同一个时间下面,只能有一个线程具有互斥的特性(独占,排他),互斥句柄被持有的时候表现为无信号
没有被持有表现为有信号[可不可以被持有],WaitForXXX的时候,先等先得到
互斥的使用
互斥句柄式有状态的句柄
HANDLE CreateMutex( //创建成功返回互斥句柄,可以锁定多行代码
LPSECURITY_ATTRIBUTES lpMutexAttributes, //指向安全属性的指针,废弃
BOOL bInitialOwner, //标志初始所有权
LPCTSTR lpName //指向mutex对象名称的指针
);
//释放互斥句柄
BOOL ReleaseMutex(HANDLE hMutex);
//关闭互斥句柄
CloseHandle();
互斥句柄的理解
也是相当于一把锁,拿着的时候,锁上来做事情,同样在等待锁(互斥句柄)的线程就得等待
//实例
前面两个都是资源的抢占(都是加锁实现的)
3.事件(句柄为可等候句柄[事件的句柄可以有多个])
解决线程之间的协调工作
HANDLE CreateEvent( //程序员自己控制是否有信号
LPSECURITY_ATTRIBUTES lpEventAttributes, //指向安全属性的指针
BOOL bManualReset, //手动重置事件的标志。TRUE表示手动设置,FALSE:自动[表示的是在等待Event有信号之后操作系统给我们设置为无信号]
BOOL bInitialState, //事件为初始状态 TRUE:有信号
LPCTSTR lpName //事件命名
);
4.信号量(作用类似于事件)信号量句柄是可等候句柄[有信号就通过,没信号就不能通过]
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //指向安全属性的指针
LONG lInitialCount, //初始计数值,然后等一次,然后 -- 知道0的时候就阻塞在WaitFor ,该值为0的时候表示无信号
LONG lMaximumCount, //最大计数值Max
LPCTSTR lpName //指向信号量对象名称的指针
)
BOOL ReleaseSemaphore(
HANDLE hSemaphore, //
LONG lReleaseCount, //倒计数字
LPLONG lpPreviousCount //可以为NULL,用来存储修改前的信号量的数量
)
//代码演示