WaitForMultipleObjects当数量过多时失效?
来源:互联网 发布:影视制作软件有哪些 编辑:程序博客网 时间:2024/04/30 15:45
多线程编程时用WaitForMultipleObjects函数可以很方便的等待多个线程的退出。但是在一个并行计算pi的程序中出现了一些小问题:为了对比测试不同线程数量的效率,不断加大 线程数,而当线程数大于64时却出现了下图的结果
而且第一行的输出基本上是一运行就输出,而下面的“任意键继续”却等了一会儿才跳出来,显然程序并没有按照设计等到所有线程计算完毕后才继续执行输出pi值。
百度了一下,看到http://www.cnblogs.com/ayanmw/archive/2012/11/13/2767628.html的作者也遇到了和我一样的问题,不过他也没有给出解决方案。
只好乖乖的去msdn找这个函数的用法(http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms687025(v=vs.85).aspx),看到了这样一段话:
To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:
- Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups ofMAXIMUM_WAIT_OBJECTS.
- Call RegisterWaitForSingleObject to wait on each handle. A wait thread from the thread pool waits onMAXIMUM_WAIT_OBJECTS registered objects and assigns a worker thread after the object is signaled or the time-out interval expires.
看来这个函数确实有个数的限制,最多不能超过MAXIMUM_WAIT_OBJECTS个。这个宏的定义在WinNT.h中
#define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
而如果要想等待超过它的数量,按msdn所说有两种方法,都是先要将原来的Objects分成N组,每组不超过MAXIMUM_WAIT_OBJECTS个。方法1是新建N个线程分别等待N组对象,主线程等待这N个线程(若N还是大于MAXIMUM_WAIT_OBJECTS则还可以再次使用这个方法,形成一个树形结构);而方法2是先等待第1组,若第1组超时或收到了信号则继续等待第2组,依次类推顺序等待每一组。
由于第二种方法相对实现比较简单,我选择了这种方法
int waitNumbers = numThreads / MAXIMUM_WAIT_OBJECTS + 1;for (int i = 0; i < waitNumbers; ++i)WaitForMultipleObjects((i == waitNumbers - 1) ? (numThreads - i * MAXIMUM_WAIT_OBJECTS) : MAXIMUM_WAIT_OBJECTS,hThread + i * MAXIMUM_WAIT_OBJECTS, TRUE, INFINITE);
其中numThreads是总线程数量,hThread数组存放所有线程句柄。
- WaitForMultipleObjects当数量过多时失效?
- 当文字过多时,显示省略号
- 当表字段过多时,hibernate怎么优化?
- 当字数(如:标题字数)过多时用...代替
- 当显示内容过多时的滚屏类Container.java
- jsp页面,当要显示的文本内容过多时,用省略号代替
- 【Effective Java】Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder
- jsp页面,当要显示的文本内容过多时,用省略号代替
- seletc-options:当输入的数据量过多时 SQL语句dump
- C# 当double数值较大且小数位过多时转化成字符串并保留小数位
- INSERT OVERWRITE DIRECTORY,当map 或者reduce 数量不一样多时 不会删除之前的文件,MR执行架构有变化时,
- 短连接过多时,TIME_WAIT问题解决
- WaitForMultipleObjects
- WaitForMultipleObjects
- WaitForMultipleObjects
- WaitForMultipleObjects
- WaitForMultipleObjects
- WaitForMultipleObjects
- 数据结构与算法
- Web.xml详解
- 如何做技术型销售
- 一个多关键词按照匹配程度查找并获取的弱智php程序片段
- log4j日志默认输出路径
- WaitForMultipleObjects当数量过多时失效?
- 汇编调用c函数为什么要设置栈
- Unable to detect application ABI's
- hibernate的工具类
- 书评: LINQ高级编程
- zoj1805-Squadtrees
- .写student类中的select,delete,update,insert方法并在objectDataSource中应用
- Box2d源码学习<二>内存管理之SOA的实现
- 《coredump问题原理探究》windows版3.2节局部变量