c++ 多线程同步 互斥对象 输入输出流

#include

#include

using namespace std;

// 声明两个线程函数

DWORD WINAPI ThreadProc1(
LPVOID lpParameter // thread data

);

DWORD WINAPI ThreadProc2(
LPVOID lpParameter // thread data

);

// 全局票数

int gTicket = 100;

// 互斥对象

HANDLE hMutex;

int main()
{
// 创建两个线程句柄

HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);

// 创建互斥对象  
hMutex = CreateMutex(NULL, false, NULL); 

// 关闭两个线程句柄  
CloseHandle(hThread1); 
CloseHandle(hThread2); 

// 主线程睡4秒,方便两个线程函数能够获取CPU时间片  
Sleep(4000); 

system("pause"); 
return 0; 

}

// 定义两个线程函数

DWORD WINAPI ThreadProc1(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread1 sell ticket "<<gTicket--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter )
{
while(true)
{
WaitForSingleObject(hMutex, INFINITE);
if(gTicket > 0)
{
cout<<"thread2 sell ticket "<<gTicket--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
用断点调试,竟然发现了这样的问题。线程1的函数获取互斥对象的拥有权(并未释放拥有权),接着切换CPU时间片,进入到了线程2函数的WaitForSingleObject,然后调用了线程2函数的 cout<<"thread2 sell ticket "<<gTicket--<<endl;,这是怎么一回事呢,线程1函数还未释放拥有权,线程2函数怎么还能运行的?

使用互斥对象,显示的结果有时候会是这样。百思不得其解。

结果
既然对全局变量加锁了,为什么输入输出流还可以被打断??

输入输出流
1. 用控制符输出格式,例:
#include <iostream>
#include <iomanip>//利用控制符输出必须包含iomanip头文件
using namespace std;
int main()
{int a;
cout<<"input a:";
cin>>a;
cout&l......
答案就在这里:C++输入输出流
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?