【问题标题】:using Dynamic array of HANDLE(void*) with createThread(...)使用带有 createThread(...) 的 HANDLE(void*) 的动态数组
【发布时间】:2015-11-18 09:21:38
【问题描述】:

我是 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*做逻辑。

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

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

【问题讨论】:

    标签: c multithreading winapi


    【解决方案1】:

    这一行:

    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 中强制使用不同签名的函数会导致以后出现奇怪的问题。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 2017-04-18
        • 1970-01-01
        相关资源
        最近更新 更多