首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

双核双线程(创设了互斥对象) 为什么有时一个线程执行两遍

2013-02-27 
双核双线程(创建了互斥对象) 为什么有时一个线程执行两遍?从孙鑫c++教程学的但是执行时一个线程有时会运行

双核双线程(创建了互斥对象) 为什么有时一个线程执行两遍?
从孙鑫c++教程学的    但是执行时一个线程有时会运行两遍  有时输出还很混乱
 比如会输出
 Thread1 sell  ticket:100
 Thread1 sell  ticket:100
 Thread2 sell  ticket:99
 还有时候输出
 Thread1 sell  ticket:Thread2 sell ticket 2625
 操作系统是win7   是操作系统的问题?还是双核的问题?。。。
 #include<iostream.h>
 #include<windows.h>
 DWORD WINAPI Thread1Proc(
 LPVOID lpParameter
 );
 DWORD WINAPI Thread2Proc(
  LPVOID lpParameter
 );
 int ticket=100;
 HANDLE hMutex;
 void main()
 {
  
 HANDLE hThread1;
 hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL);
 HANDLE hThread2;
 hThread2=CreateThread(NULL,0,Thread2Proc,NULL,0,NULL);
 CloseHandle(hThread1);
 CloseHandle(hThread2);
 //cout<<"MainThread is running!"<<endl;
 hMutex=CreateMutex(NULL,FALSE,NULL);
 Sleep(1000);
 return;
 
}
 DWORD WINAPI Thread1Proc(
 LPVOID lpParameter 
 )
 {
 while(ticket)
 {
 WaitForSingleObject(hMutex,0);
 cout<<"Thread1 sell ticket:"<<ticket--<<endl;
 ReleaseMutex(hMutex);
 }
 return 0;
 }
 DWORD WINAPI Thread2Proc(
  LPVOID lpParameter 
  )
 {
 while(ticket)
 {
 WaitForSingleObject(hMutex,0);
 cout<<"Thread2 sell ticket:"<<ticket--<<endl;
 ReleaseMutex(hMutex);
 }
 return 0;
 }
 

[解决办法]
应该不是孙鑫的教学视频里的。 是楼主自己写的吧 有很大的问题。

hMutex=CreateMutex(NULL,FALSE,NULL);
放到CreateThread前面

DWORD WINAPI Thread1Proc(
 LPVOID lpParameter 
 )
{
while(1)
{
WaitForSingleObject(hMutex, INFINITE);
if (ticket == 0)
{
ReleaseMutex(hMutex);
break;
}
cout<<"Thread1 sell ticket:"<<ticket--<<endl;
ReleaseMutex(hMutex);
}
return 0;
}
 给你改了下 , Proc2 同上。
[解决办法]
我没听说过“输入输出流是线程安全的”
并不是一个线程执行两次,而是两个线程同时访问涉及硬件的流对象导致流对象功能异常

热点排行