帮忙解释一下这段代码(很短)

APIandMFC 2009-03-11 08:21:25
#include<windows.h>
#include<iostream.h>

int index=0;
int tickets=100;
HANDLE hMutex;
DWORD WINAPI FunProc1(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
cout<<"Thread1 is telling ticket:"<<tickets--<<endl;
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI FunProc2(LPVOID lpParameter)
{
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
cout<<"Thread2 is telling ticket:"<<tickets--<<endl;
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
void main()
{
HANDLE hThread1,hThread2;
hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex=CreateMutex(NULL,FALSE,NULL);
Sleep(4000);
}


请问这段代码的执行过程是什么样的?最好能细一些.另外我有几个问题:

1 当执行完"hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);"后,执行哪一句?是接着创建第二个线程还是进入到"线程处理函数"?

2什么时候执行第一个"线程处理函数"?为什么?

3什么时候执行第二个"线程处理函数"?为什么?

4子线程执行的顺序是什么?(是"谁先创建执行谁吗"?不单是这个程序)

5创建互斥对象后,谁先得到"互斥资源"?根据是什么?

6当线程1执行"ReleaseMutex(hMutex);"后,程序怎样执行?为什么?

谢谢各位朋友
...全文
121 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheidtf 2009-03-14
  • 打赏
  • 举报
回复
相应的视频我都看过.好像模仿联网买票系统.

hMutex,这是一个互斥信号量,
ReleaseMutex(hMutex)

打个最形象的比方,假如你和同事做干活,干活都需要工具,但是工具只有一个.你用的时候,他就必需等你用完后,工具交由他才能干活.
他用了一段时间后,再给你.就这样反复来反复去.
例子不够具体.
sleep(4000);//作用是让主线程多运行一段时间,让了线程有时间多运行一会儿再干该干的事.
主线程一结束,子线程也将不复存在.
greatws 2009-03-11
  • 打赏
  • 举报
回复
CloseHandle(hThread1);表示什么意思?
关闭线程句柄,释放资源,但是线程会继续执行,不会被结束


如何在CreateThread时指定CREATE_SUSPENDED,它的意义是什么?
CreateThread(NULL,0,FunProc1,NULL,CREATE_SUSPENDED,NULL);
创建线程时并不马上执行线程函数,而是把它挂起,必须调用ResumeThread才能执行它



建议LZ装个MSDN看看,有不懂的函数就去查查,比上来发问来得快
APIandMFC 2009-03-11
  • 打赏
  • 举报
回复
CloseHandle(hThread1);表示什么意思?


如何在CreateThread时指定CREATE_SUSPENDED,它的意义是什么?
fangxu1999 2009-03-11
  • 打赏
  • 举报
回复
在多线程编程过程中,一定要知道一个前提:各个线程之间执行的先后次序是未知的,由操作系统根据情况自己调度的。所以说可能先创建的线程在后创建的线程之后才开始运行。但是,通常如果在单个CPU的机器上,一般是先创建先调度的,但是这个不能作为一个普遍性的假设,所以线程之间的同步问题非常重要。

1 当执行完"hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);"后,执行哪一句?是接着创建第二个线程还是进入到"线程处理函数"?
不确定。看操作系统调度

2什么时候执行第一个"线程处理函数"?为什么?
只要CreateThread成功返回后,第一个线程就具备了运行条件,何时执行看操作系统调度

3什么时候执行第二个"线程处理函数"?为什么?
同上

4子线程执行的顺序是什么?(是"谁先创建执行谁吗"?不单是这个程序)
不确定。看操作系统调度

5创建互斥对象后,谁先得到"互斥资源"?根据是什么?
两个线程在抢夺这个资源,谁先得到则还是看操作系统的调度了。

6当线程1执行"ReleaseMutex(hMutex);"后,程序怎样执行?为什么?
此时,该资源已经被释放成为可用的了。此时,两个线程又开始抢夺这个资源,谁先得到则还是看操作系统的调度了。所以,很有可能还是线程1继续得到。

注意,你给出的例子有个异常情况,这也是和操作系统调度有关的。有可能在CreateThread成功调用后,CreateMutex还没有执行到,此时创建出的一个线程开始执行了,WaitForSingleObject将无效,此时互斥量句柄无效。所以最好是在CreateThread时指定CREATE_SUSPENDED,在CreateMutex后再ResumeThread它们。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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