如何修改CreateThread函数

How do I modify CreateThread function?

本文关键字:CreateThread 函数 修改 何修改      更新时间:2023-10-16

正如我的标题所说,我正在尝试修改CreateThread函数。我希望它使用循环来报告线程的序列号。

我对C++编程还很陌生,不确定哪个参数需要更改。我怀疑它可能是"lpParameter",但在查看了微软网站后(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;
}

目前尚不清楚您要做什么,但很明显,您在错误的位置调用了WaitForMultipleObjects

您正试图在只创建一个线程后等待numThreadshThread数组的其余部分仍然未初始化,将野生句柄传递给WaitForMultipleObjects是个糟糕的主意。

将等待呼叫移到循环之外。

您的线程例程必须声明为

DWORD name (LPVOID whatever) 

作为lpParameter传递的内容都将传递给线程。在这种情况下,将integer强制转换为指针并返回。

如前所述,如果要将参数传递给线程,则使用lpParameter。它需要一个指针,所以您可以传递,例如&i,尽管这不是一个好主意。您可以创建一个指向int的指针,并将其传递,然后在WaitForMultipleObjects返回后删除。

正如本所说,你打错了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中将lpParameter强制转换为int。

试试类似的东西:

const int maxThreads = 4; 
DWORD WINAPI helloFun(LPVOID pArg)
{
    int num = * (int*) pArg;
    printf("Hello from Thread %dn", 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: %un", GetLastError());
            break;
        }
        ++numThreads;
    }
    if (numThreads > 0)
    {
        WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);
        for (int i = 0; i < numThreads; i++)
            CloseHandle(hThread[i]);
    }
    return 0;
}