使用动态句柄数组(void*)和createThread(…)

使用动态句柄数组(void*)和createThread(…),c,multithreading,winapi,C,Multithreading,Winapi,我是C语言的初学者,尤其是线程 我需要malloc并使用HANDLE的动态数组,该数组稍后将在WaitForMultipleObjects中使用 我现在做的是: int i = 0 ; HANDLE ThreadHandlers = (HANDLE)malloc(sizeof(HANDLE)* List->logicalLength); 然后在循环中: while(curr!= NULL) { ThreadHandlers[i]= createtestThread((LPTHR

我是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:表达式必须是指向完整对象类型的指针

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

  • 可以采取哪些变通办法

  • 做这种编程的正确方法是什么?(等待未知数量的线程)

  • 这一行:

    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是或的包装器。但是,如果您必须显式地将函数强制转换为LPTHREAD\u START\u例程,那么您可能做错了什么。移除铸件,使该线成为:

    ThreadHandlers[i]= createtestThread(executeTest,(TestStruct*)(curr->data),ThreadIds+i);
    
    然后,如果这仍然导致新的编译器错误,请修复executeTest的声明,使其声明如下:

    DWORD __stdcall executeTest(void* pData);
    
    在CreateThread中强制使用不同签名的函数将导致以后出现奇怪的问题。

    这一行:

    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是或的包装器。但是,如果您必须显式地将函数强制转换为LPTHREAD\u START\u例程,那么您可能做错了什么。移除铸件,使该线成为:

    ThreadHandlers[i]= createtestThread(executeTest,(TestStruct*)(curr->data),ThreadIds+i);
    
    然后,如果这仍然导致新的编译器错误,请修复executeTest的声明,使其声明如下:

    DWORD __stdcall executeTest(void* pData);
    

    在CreateThread中强制使用不同签名的函数将导致以后出现奇怪的问题。

    您在创建句柄数组时犯了一个错误,您应该做的是:

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

    至于第二个问题,使用
    WaitForMultipleObjects
    是等待未知数量线程的正确方法。根据具体情况,如果只想等待一个线程收到信号,则可以将FALSE作为第三个参数传递;如果要在某个时间段后停止等待,则可以将某个超时间隔作为第四个参数传递。

    如果在创建句柄数组时出错,则应执行以下操作:

    HANDLE *ThreadHandlers = (HANDLE*)malloc(sizeof(HANDLE) * List->logicalLength);
    
    至于第二个问题,使用
    WaitForMultipleObjects
    是等待未知数量线程的正确方法。根据具体情况,如果只想等待一个线程收到信号,则可以将FALSE作为第三个参数传递;如果要在某个时间段后停止等待,则可以将某个超时间隔作为第四个参数传递