就像我的标题所说,我试图修改CreateThread功能。我希望它使用循环报告线程的序列号。
我在C ++编程时相当新,不确定哪个参数需要更改。我怀疑它可能是' lpParameter'但在查看microsofts网站(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx)后,我仍然不明白这些参数是如何工作的。
到目前为止,我有:
int int_tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[numThreads];
int tNum[10];
for (int i = 0; i < numThreads; i++)
{
tNum[i] = i;
hThread[i] =
CreateThread(NULL, 0, helloFun, NULL, 0, NULL);
} WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
return 0;
}
产生空白线程。
编辑:
对不起混淆的人。我已经声明了线程例程:
const int numThreads = 4;
DWORD WINAPI helloFun(LPVOID pArg)
{
printf("Hello Thread \n");
return 0;
}
答案 0 :(得分:1)
目前尚不清楚您要做什么,但很明显您在错误的地方致电WaitForMultipleObjects
。
在创建一个线程后,您正在尝试等待numThreads
。 hThread
数组的其余部分仍然未初始化,将通用句柄传递给WaitForMultipleObjects
是一个糟糕的主意。
将等待呼叫移出循环。
答案 1 :(得分:0)
必须声明您的线程例程
DWORD name (LPVOID whatever)
随着lpParameter传递给线程,传递的是什么。在这种情况下,将整数转换为指针并返回。
答案 2 :(得分:0)
如前所述,如果要将参数传递给线程,则使用lpParameter。它需要一个指针,所以你可以传递,例如,&i
,虽然这不是一个好主意。你可以创建一个指向int的指针,然后传递它,然后在WaitForMultipleObjects
返回后删除。
正如Ben所说,你在错误的地方打电话给WaitForMultipleObjects
。
这样的事情应该有效:
int int_tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[numThreads];
int tNum[10];
int *parameters[numThreads];
for (int i = 0; i < numThreads; i++)
{
tNum[i] = i;
parameters[i] = new int(i);
hThread[i] = CreateThread(NULL, 0, helloFun, (void *)parameters[i], 0, NULL);
}
WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
for (int i = 0; i < numThreads; i++)
delete parameters[i];
return 0;
}
您必须在helloFun
。
答案 3 :(得分:0)
尝试更像这样的事情:
const int maxThreads = 4;
DWORD WINAPI helloFun(LPVOID pArg)
{
int num = * (int*) pArg;
printf("Hello from Thread %d\n", num);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[maxThreads];
int tNum[maxThreads];
int numThreads = 0;
for (int i = 0; i < maxThreads; i++)
{
tNum[numThreads] = i+1;
hThread[numThreads] = CreateThread(NULL, 0, &helloFun, &tNum[numThreads], 0, NULL);
if (hThread[numThreads] == NULL)
{
printf("Unable to create a thread! Error: %u\n", GetLastError());
break;
}
++numThreads;
}
if (numThreads > 0)
{
WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
for (int i = 0; i < numThreads; i++)
CloseHandle(hThread[i]);
}
return 0;
}