线程同步

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,用来存储修改前的信号量的数量
)
//代码演示