无线程锁代码 火车票第100张重复两次
利用互斥对象实现同步
互斥对象mutex 包含一个使用数量,一个线程id 一个计数器.其中id用于标识系统中哪个对象拥有当前对象,计数器指明线程拥有该计数器的次数
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全性 默认null
_In_ BOOL bInitialOwner,//指定初始对象的默认拥有者,true为本线程
_In_opt_ LPCTSTR lpName//互斥对象的名称 null创建匿名互斥对象
);
当线程对共享资源访问结束的时候,应该调用ReleaseMutex释放该对象的拥有权 另外
线程必须主动请求共享对象的使用权才能获得该对象的所有权.
Dword WaitForSingleObject(HANDLE hHandle , DWORD dwmilliseconds);
hMutex = CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(hMutex, INFINITE);
线程在未释放互斥对象就终止的情况下,会自动设置互斥对象的id为0,引用为0
可以通过他的返回值 WaitForSingleObject 判断 线程是正常获取锁的 还是上次程序退出为释放才获得锁的,第二种情况容易引发未知状况
参考::msdn
孙鑫c++
HANDLE WINAPI CreateMutex( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, _In_ BOOL bInitialOwner, _In_opt_ LPCTSTR lpName );