MAXIMUM_WAIT_OBJECTS真的是64吗?

Jak*_*ake 9 c++ multithreading

MSDN说

对象句柄的最大数量为MAXIMUM_WAIT_OBJECTS

for WaitForMultipleObjects...在我的计算机上定义为64.它真的只有64吗?

谢谢

Gab*_*abe 17

是的,它确实是64.因为它是a #define,它不能在没有重新编译程序的情况下改变,所以它几乎永远不会改变.

由于STATUS_ABANDONED_WAIT_63被定义为0xBF并且STATUS_USER_APC被定义为0xC0,如果你增加MAXIMUM_WAIT_OBJECTS甚至只有一个,则无法区分被放弃的第65个句柄与APC终止等待之间的区别.正确更改MAXIMUM_WAIT_OBJECTS将需要重新编号状态代码,这需要重新编译现有的每个Win32程序.

此外,编译为MAXIMUM_WAIT_OBJECTS定义为65 的程序将在定义为64的OS上失败.

  • @MSalters:你当然是错的.如果您将一个编入128的程序编入其中并在编译了64的操作系统上运行它,则该程序将失败. (8认同)
  • @MSalters:我没有说它永远不会改变; 我说它可能*几乎*永远不会改变.无论如何,按照你的建议使用`WAIT_OBJECT_64`是行不通的,因为在游戏开始之后它会改变规则.MS不能只改变文档来说"如果你将`_WIN32_WINNT`定义为0x0700或更高,你必须仔细地重构使用`MAXIMUM_WAIT_OBJECTS`的任何代码来考虑`WAIT_OBJECT_64`",因为人们不会这样做和他们的代码将以奇怪而神秘的方式开始失败. (6认同)
  • @MSalters:你应该读我的答案.将'MAXIMUM_WAIT_OBJECTS`增加偶数1需要重新映射状态代码,这样,如果加载了期望旧状态代码的DLL,则接收新状态代码的进程将失败. (2认同)

Rob*_*edy 9

是的,那真的是那个宏的价值.

这是否真的是函数能够一次等待的最大对象数是内部实现细节.但是如果正在编写该函数,我会检查给定的数组长度,以确保它在继续之前是在记录的范围内,即使其余代码碰巧能够等待更多,因为我不想要API的使用者使用超过文档记录的最大值然后依赖于此类未记录的行为,从而在操作系统的未来版本中对函数的任何潜在实现提出要求

  • 如果你传递超过64,WaitForMultipleObjects()会返回一个错误条件.我试过了. (8认同)