使用动态句柄数组(void*)和createThread(…)
我是C语言的初学者,尤其是线程 我需要使用动态句柄数组(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
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
是typedefvoid*
我不能用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作为第三个参数传递;如果要在某个时间段后停止等待,则可以将某个超时间隔作为第四个参数传递