关于多线程编程的一个程序

a707000646 2011-10-22 03:02:27
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter);
int index = 0;
int tickets = 100;
HANDLE hMutex;
void main()
{
HANDLE hThread1,hThread2;
hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
/*while(index ++ <1000)
cout << "main thread is running" << endl;*/
//Sleep(10);
hMutex = CreateMutex(NULL,FALSE,NULL);
Sleep(4000);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter)
{
/*while(index ++ <1000)
cout << "thread1 is running" << endl;
return 0;*/
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets > 0)
{
//Sleep(10)
cout << "thread1 sell ticket : " << tickets -- <<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets > 0)
{
//Sleep(10);
cout << "thread2 sell ticket : " << tickets -- <<endl;
}
else
break;
ReleaseMutex(hMutex);
}

return 0;
}


这个是孙鑫老师视频中的源码,为什么我打印的时候会出现2行 打印100的
有时候是乱码,后面大部分显示正常
还有一个奇怪的现象是 ,如果第一个函数使用了Sleep,那么应该先打印的是thread2 sell ticket
为什么有时候会先打印出thread1

我的猜想是我的是双核CPU,不知道大家怎么认为呢,
谢谢大家帮忙
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a707000646 2011-10-23
  • 打赏
  • 举报
回复
谢谢你的帮助 ,至于你说的为什么要把平台相关的问题放在C++
那是因为CSDN的分块本来就不明显,你不说 我还真不知道呢
UndefinedCoder 2011-10-22
  • 打赏
  • 举报
回复
为什么都喜欢把平台相关的问题放在C++板块呢?
UndefinedCoder 2011-10-22
  • 打赏
  • 举报
回复
hMutex = CreateMutex(NULL,FALSE,NULL);
这句放在2个CreateThread前面。就可以避免打印2行100的问题了。因为CreateThread后线程就可以调度运行了。
当thread1 WaitForSingleObject成功后,就获得了hMutex的控制权,只要thread1不ReleaseMutex,thread2就一直阻塞在WaitForSingleObject那里,所以,thread Sleep,thread2还是得等待thread
释放hMutex的控制权,但是如果把Sleep放在while(TRUE)循环前,就几乎可以确保由thread2 sell出第一张票了。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧