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 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程