读书人

双核双线程(创设了互斥对象) 为什么

发布时间: 2013-02-27 10:48:11 作者: rapoo

双核双线程(创建了互斥对象) 为什么有时一个线程执行两遍?
从孙鑫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 同上。
[解决办法]
我没听说过“输入输出流是线程安全的”
并不是一个线程执行两次,而是两个线程同时访问涉及硬件的流对象导致流对象功能异常

读书人网 >C++

热点推荐