【问题标题】:WaitForMultipleObjects crashes on 64bit windowsWaitForMultipleObjects 在 64 位窗口上崩溃
【发布时间】:2012-04-16 19:58:43
【问题描述】:

考虑下面的代码:

for (int i = 0; i < thread_number; i ++)
    hThreadArray[i] = CreateThread( 
            0,                   
            0,                      
            single_thread_function_name,      
            (LPVOID)i,                      
            0,                      
            &dwThreadIdArray[i]);   


WaitForMultipleObjects(thread_number, hThreadArray, TRUE, INFINITE);

它在 32 位平台上可以正常工作,但在 64 位平台上它会崩溃。

崩溃发生在 WaitForMultipleObjects 函数中。

有人知道我做错了什么吗?

编辑: hThreadArray 声明为:

HANDLE*  hThreadArray;
hThreadArray = (HANDLE*) malloc (thread_number * sizeof(HANDLE));

single_thread_function_name 为:

DWORD WINAPI single_thread_function_name( LPVOID lpParam ){
.....
return 0;
}

【问题讨论】:

  • 能把hThreadArray的声明和single_thread_function_name()的代码贴出来吗?
  • 你是否在 hThreadArray 中存储了任何东西,或者你是否让它未初始化?
  • “它崩溃”到底是什么意思? thread_number 的值是多少?它比MAXIMUM_WAIT_OBJECTS 大吗?你能提供一个失败的完整程序吗?去掉所有不需要的东西。
  • DavidHeffernan:thread_number 的值为 2,静态分配。 @bmargulies:我分配了内存空间,但我没有初始化 hThreadArray 数组。错了吗?
  • 你能提供一段可重现的代码吗?从这里看起来很好(但我有一段时间没有这样做了)。

标签: c++ windows multithreading 64-bit


【解决方案1】:

hThreadArray 不是数组,只是一个指针,它肯定会崩溃。奇怪的是它在 32 位平台上是如何工作的。

由于 hThreadArray 是 malloced,可能不符合 64 位对齐要求。尝试:

HANDLE hThreadArray[100] = {0};

【讨论】:

  • 数组名是指向数组第一个元素的指针。没有hThreadArray的初始化,不能说它不是数组。
  • 是的,我是这样初始化的:hThreadArray = (HANDLE*) malloc (thread_number * sizeof(HANDLE));这是一个数组。
  • "可能不符合 64 位对齐要求。"这是一个绝妙的建议。使用 new[] 而不是邪恶的 C malloc 也将确保对齐要求是适当的。
  • 对齐 - 打赌就是这样,(没有实际现金......)。
  • 问题是single_thread_funcion使用了malloc;加倍 malloc 的大小解决了这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多