zhengaoly
zhengaoly
2016-06-10 13:12

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

  • 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函数怎么还能运行的?

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

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答

为你推荐

换一换