如何修改CreateThread功能?

时间:2015-02-17 23:45:48

标签: c++

就像我的标题所说,我试图修改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;
}

4 个答案:

答案 0 :(得分:1)

目前尚不清楚您要做什么,但很明显您在错误的地方致电WaitForMultipleObjects

在创建一个线程后,您正在尝试等待numThreadshThread数组的其余部分仍然未初始化,将通用句柄传递给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

中将lpParameter强制转换为int

答案 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;
}