在c ++中使用线程

时间:2016-04-29 13:21:53

标签: c++ multithreading winapi

我需要创建两个线程,其中一个将返回偶数,另一个将返回奇数。我究竟做错了什么?

here is my console

Here is a screenshot of my functions

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD ID1 = 1, ID2 = 100;
    DWORD arr[] = {ID1, ID2};
    HANDLE h[1];
    for (int i = 0; i < 2; ++i)
    {
        h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]);
        if (h[0] == NULL)
            _tprintf(_T("%d"), GetLastError());
        h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]);
        if (h[1] == NULL)
            _tprintf(_T("%d"), GetLastError());
    }

    WaitForMultipleObjects(2, h, TRUE, INFINITE);

    for (int i = 0; i < 2; ++i)
        CloseHandle(h[i]);

    return 0;
}

1 个答案:

答案 0 :(得分:3)

更改此

HANDLE h[1];
for (int i = 0; i < 2; ++i)
{
    h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]);
    if (h[0] == NULL)
        _tprintf(_T("%d"), GetLastError());
    h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]);
    if (h[1] == NULL)
        _tprintf(_T("%d"), GetLastError());
}

到此

HANDLE h[2];
h[0] = CreateThread(NULL, 0, &f1, arr, 0, &arr[0]);
if (h[0] == NULL)
    _tprintf(_T("%d"), GetLastError());
h[1] = CreateThread(NULL, 0, &f2, arr, 0, &arr[1]);
if (h[1] == NULL)
    _tprintf(_T("%d"), GetLastError());
  • 你正在for循环体内创建2个线程,执行两次(当你真正意味着2时,是AKA 4个线程)。
  • 您正在尝试将这些线程的句柄保存到HANDLE数组中,该数组只能容纳一个元素。
  • 在循环的第二次执行时,你再次覆盖了h []的元素,所以当你稍后等待它们完成并尝试关闭句柄时,你甚至都没有关闭相同的句柄。
  • 你需要HANDLE数组的大小为2,你需要删除第一个for循环(你是分别传递函数指针,所以除非你把函数指针放入一个循环中,否则无法在循环中执行此操作与h [])相同长度的数组。