使用动态数组HANDLE(void *)和createThread(...)

时间:2015-11-18 09:21:38

标签: c multithreading winapi

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

我需要@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(getApplicationContext()); setContentView(R.layout.activity_main); } 并使用后来在malloc中使用的HANDLE动态数组。

我现在做的事情:

WaitForMultipleObjects

然后循环:

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

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

  

IntelliSense:expression必须是指向完整对象类型的指针

我的理解是因为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); 是typedef HANDLE 而且我不能用void*来做逻辑。

  1. 可以采取哪些解决方法?

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

2 个答案:

答案 0 :(得分: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将导致以后出现奇怪的问题。

答案 1 :(得分:2)

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

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

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