gpt4 book ai didi

c - 使用带有 createThread(...) 的 HANDLE(void*) 的动态数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:28 24 4
gpt4 key购买 nike

我是 C 语言的初学者,尤其是线程。

我需要 malloc 并使用 HANDLE 的动态数组,稍后将在 WaitForMultipleObjects 中使用。

我现在做什么:

int i = 0 ;
HANDLE ThreadHandlers = (HANDLE)malloc(sizeof(HANDLE)* List->logicalLength);

然后在一个循环中:

while(curr!= NULL) 
{
ThreadHandlers[i]= createtestThread((LPTHREAD_START_ROUTINE)executeTest,(TestStruct*)(curr->data),ThreadIds+i);

curr = curr->next;
//ThreadHandlers[i] =
i++;
}

WaitForMultipleObjects(
List->logicalLength,
ThreadHandlers,
TRUE, /* wait until all threads finish */
INFINITE);

但是当我尝试编译时,我得到:

IntelliSense: expression must be a pointer to a complete object type

根据我的理解,这是因为 HANDLE 是 typedef void*而且我不能用 void* 做逻辑。

  1. 可以采取什么解决方法?

  2. 进行这种编程的正确方法是什么? (等待未知数量的线程)

最佳答案

这一行:

HANDLE  ThreadHandlers  =   (HANDLE)malloc(sizeof(HANDLE)* List->logicalLength);

应该是这样的:

HANDLE*  ThreadHandlers  =   (HANDLE*)malloc(sizeof(HANDLE) * List->logicalLength);

上述修复将解决有关 WaitForMultipleObjects 的编译问题。

当我在这里时,这条线看起来很可疑:

ThreadHandlers[i]= createtestThread((LPTHREAD_START_ROUTINE)executeTest,(TestStruct*)(curr->data),ThreadIds+i);

我假设 createtestthread 是 CreateThread 的包装器或 _beginthreadex .但是如果你必须明确地将你的函数明确地转换为 LPTHREAD_START_ROUTINE,你可能做错了什么。删除强制转换,使此行变为:

ThreadHandlers[i]= createtestThread(executeTest,(TestStruct*)(curr->data),ThreadIds+i);

然后,如果仍然导致新的编译器错误,请修复 executeTest 的声明,使其声明如下:

DWORD __stdcall executeTest(void* pData);

将不同签名的函数强加到 CreateThread 中会导致以后出现奇怪的问题。

关于c - 使用带有 createThread(...) 的 HANDLE(void*) 的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com