zhengaoly 2016-06-10 13:12 采纳率: 0%
浏览 1924

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条回答 默认 最新

  • zhengaoly 2016-06-10 13:12
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式