关于多个线程同时等待一个信号的问题,求高手解答

boyka913 2013-10-29 11:05:43
1.假设,有一个事件对象是手动的(CreateEvent(NULL,TRUE,FALSE,NULL),有5个线程在等待信号(WaiforSingleObject),则当调用SetEvent时,5个线程会同时收到信号,得到信号之后的代码执行顺序是随机的。
问题1:得到信号之后的代码执行顺序,取决于线程得到时间片的顺序吗?。

2.假设,有一个事件对象是自动(CreateEvent(NULL,FALSE,FALSE,NULL),有5个线程在等待信号(WaiforSingleObject),则当调用SetEvent时,只有一个线程会得到信号,得到信号的这个线程也是随机的。
问题2:得到执行的这个线程,也是取决于哪个线程先得到时间片吗?

是否可以认为:
问题3. 当线程调用WaiforSingleObject等函数时,其实操作系统也会给他分配时间片,只是如果这个信号一直是无信号状态,我们就看不到线程的执行?
问题4. 当信号变成有信号时,同时等待的多个线程,哪个先得到执行的时间片就得到了信号,得到继续执行的权利?
测试代码如下,执行顺序请在状态下查看“输出”窗口,查看线程退出码,可以知道是哪个线程退出了,你可能需要新建一个对话框工程,并添加两个按钮:
long nCnt = 0;
HANDLE hEvent = NULL;
DWORD ThreadProc(LPARAM lp)
{
InterlockedIncrement(&nCnt);
int nRet = nCnt;
TRACE("wait: %d\n", nRet);
WaitForSingleObject(hEvent, INFINITE);
//TRACE("end : %d\n", nRet);
return nRet;
}

void CTestMfcDlg::OnBnClickedButton1()
{
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
for (int i=0; i<25; i++)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, 0, 0, 0);
}
}

void CTestMfcDlg::OnBnClickedButton2()
{
SetEvent(hEvent);
}
...全文
525 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
boyka913 2013-10-29
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
WaitForMultipleObjectsEx 《Windows核心编程》
你没有看懂我的问题,我的问的是多个线程,等待一个信号,WaitForMultipleObjectsEx 是一个线程,等待多个信号。
赵4老师 2013-10-29
  • 打赏
  • 举报
回复
WaitForMultipleObjectsEx 《Windows核心编程》
boyka913 2013-10-29
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
没仔细看楼主的问题,不过建议可以参考书籍 《Windows核心编程》以及MSDN文档。
书看过了,不过似乎没有相关的内容。
JiMoKuangXiangQu 2013-10-29
  • 打赏
  • 举报
回复
没仔细看楼主的问题,不过建议可以参考书籍 《Windows核心编程》以及MSDN文档。
赵4老师 2013-10-29
  • 打赏
  • 举报
回复
《Windows核心编程》第9章 线程与内核对象的同步

64,637

社区成员

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

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