多线程 疑问

lianhui1987 2009-01-10 01:43:22
各位高手帮我看一下以下代码(参考孙鑫的视频写的)我没分了,好心人就指点一下吧
#include <iostream.h>
#include <windows.h>

DWORD WINAPI ThreadProc_1(LPVOID lpParameter);
DWORD WINAPI ThreadProc_2(LPVOID lpParameter);

int tickets = 100;
HANDLE hMutex;

int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL,0,ThreadProc_1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,ThreadProc_2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex = CreateMutex(NULL,FALSE,NULL);
Sleep(4000);
return 0;
}

DWORD WINAPI ThreadProc_1(LPVOID lpParameter)
{
DWORD result1;
while(TRUE)
{
result1 = WaitForSingleObject(hMutex,INFINITE);
if(tickets /*&& result1 != WAIT_FAILED*/)
{
cout<<"Thread1 sells ticket:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI ThreadProc_2(LPVOID lpParameter)
{
DWORD result2;
while(TRUE)
{
result2 = WaitForSingleObject(hMutex,INFINITE);
if(tickets/* && result2 != WAIT_FAILED*/)
{
cout<<"Thread2 sells ticket:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
我查了一下WaitForSingleObject()的第二个参数为INFINITE,当hMutex为非信号态时,线程应挂起,而不会执行下面的代码,但是我发现程序还是往下执行,我加了if(tickets && result2 != WAIT_FAILED)后好了,不加之前,有时会出现以下结果:
Thread1 sells ticket:100
Thread1 sells ticket:100
Thread2 sells ticket:99
Thread1 sells ticket:98
Thread2 sells ticket:97
Thread1 sells ticket:96
Thread2 sells ticket:95
Thread1 sells ticket:94
Thread2 sells ticket:93
Thread2 sells ticket:92
Thread2 sells ticket:91
Thread2 sells ticket:90
Thread2 sells ticket:89
Thread1 sells ticket:88
Thread2 sells ticket:87
Thread1 sells ticket:86
Thread2 sells ticket:85
Thread1 sells ticket:84
Thread2 sells ticket:83
Thread1 sells ticket:82
Thread2 sells ticket:81
Thread1 sells ticket:80
Thread2 sells ticket:79
Thread1 sells ticket:78
Thread2 sells ticket:77
Thread1 sells ticket:76
Thread2 sells ticket:75
Thread1 sells ticket:74
Thread2 sells ticket:73
Thread1 sells ticket:72
Thread2 sells ticket:71
Thread1 sells ticket:70
Thread2 sells ticket:69
Thread1 sells ticket:68
Thread2 sells ticket:67
Thread1 sells ticket:66
Thread2 sells ticket:65
Thread1 sells ticket:64
Thread2 sells ticket:63
Thread1 sells ticket:62
Thread2 sells ticket:61
Thread1 sells ticket:60
Thread2 sells ticket:59
Thread1 sells ticket:58
Thread2 sells ticket:57
Thread1 sells ticket:56
Thread2 sells ticket:55
Thread1 sells ticket:54
Thread1 sells ticket:53
Thread2 sells ticket:52
Thread1 sells ticket:51
Thread2 sells ticket:50
Thread1 sells ticket:49
Thread2 sells ticket:48
Thread1 sells ticket:47
Thread2 sells ticket:46
Thread1 sells ticket:45
Thread2 sells ticket:44
Thread1 sells ticket:43
Thread2 sells ticket:42
Thread1 sells ticket:41
Thread2 sells ticket:40
Thread1 sells ticket:39
Thread2 sells ticket:38
Thread1 sells ticket:37
Thread2 sells ticket:36
Thread1 sells ticket:35
Thread2 sells ticket:34
Thread1 sells ticket:33
Thread2 sells ticket:32
Thread1 sells ticket:31
Thread2 sells ticket:30
Thread1 sells ticket:29
Thread2 sells ticket:28
Thread1 sells ticket:27
Thread2 sells ticket:26
Thread1 sells ticket:25
Thread2 sells ticket:24
Thread1 sells ticket:23
Thread2 sells ticket:22
Thread1 sells ticket:21
Thread2 sells ticket:20
Thread1 sells ticket:19
Thread2 sells ticket:18
Thread1 sells ticket:17
Thread2 sells ticket:16
Thread1 sells ticket:15
Thread2 sells ticket:14
Thread1 sells ticket:13
Thread2 sells ticket:12
Thread1 sells ticket:11
Thread2 sells ticket:10
Thread1 sells ticket:9
Thread2 sells ticket:8
Thread1 sells ticket:7
Thread2 sells ticket:6
Thread1 sells ticket:5
Thread2 sells ticket:4
Thread1 sells ticket:3
Thread2 sells ticket:2
Thread1 sells ticket:1
Press any key to continue
发现有问题,想请大家帮忙指点一下啊。
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
风雨无阻_赖 2010-09-20
  • 打赏
  • 举报
回复
int tickets=100;
HANDLE hMutex;

DWORD WINAPI ThreadProc_1(LPVOID lpParameter)
{
/*DWORD result1;*/
while(TRUE)
{
/*result1 = */WaitForSingleObject(hMutex,INFINITE);
if(ticket)
{
printf("threadid:%d,Thread1 sells ticket:%d\n",GetCurrentThreadId(),tickets--);
}
else
{
ReleaseMutex(hMutex);
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

DWORD WINAPI ThreadProc_2(LPVOID lpParameter)
{
/*DWORD result2;*/
while(TRUE)
{
/*result2 = */WaitForSingleObject(hMutex,INFINITE);
if(tickets)
{
printf("threadid:%d,Thread2 sells ticket:%d\n",GetCurrentThreadId(),tickets--);
}
else
{
ReleaseMutex(hMutex);
break;
}
ReleaseMutex(hMutex);
}
return 0;
}


int main(int argc,char argv[])
{
hMutex = CreateMutex(NULL,FALSE,NULL);
ReleaseMutex(hMutex);

HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL,0,ThreadProc_1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,ThreadProc_2,NULL,0,NULL);

WaitForSingleObject(hThread1,INFINITE);
WaitForSingleObject(hThread2,INFINITE);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hMutex);

printf("run end.\n");
printf("press Enter key to exit.\n");
getchar();
return 0;
}
laura0502 2009-01-20
  • 打赏
  • 举报
回复
如果你把该为WAIT_OBJECT_0就会正确了,我想问应该是明白了你的问题,因为他一直是获得激活的。。所以会显示,WAIT_OBJECT_0就是当不是激活的时候,就显示,所以就不会显示了。你还是没有理解createmutex。。
laura0502 2009-01-20
  • 打赏
  • 举报
回复
我调试了下,不加注释掉的部分,开始输出的就有错,如果加了,就会正常输出,
都会输出,你怎么加了就不输出了,不懂,你再调试下,,

希望把这个问题搞懂。。记得回帖
iceline2000 2009-01-12
  • 打赏
  • 举报
回复
1 两个辅助线程的优先级别跟主线程是一样的,同为8,所以辅助线程执行时间片中,等待互斥量的信号,但互斥量没有内核对象,所以一直失败,屏幕打印;
2 第一次运行结束,你没有::CloseHandle(hMutex),减少掉互斥量的内核计数,第二次程序运行时内核对象可能存在的,就不再屏幕打印;
lianhui1987 2009-01-11
  • 打赏
  • 举报
回复
我试试,不过要想还原这个问题还有点难,我后面没发现这个问题了,不管怎样先谢谢了
zhh157 2009-01-10
  • 打赏
  • 举报
回复
你应该把Mutex的创建放在线程创建的前面
否则,因为Mutex没有创建,而线程已经跑起来了,
可能线程WaitForSingleObject失败,而你并没有判断
依然继续运行,就会出现这种情况

64,637

社区成员

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

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