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