【问题标题】:Working with threads in c++在 C++ 中使用线程
【发布时间】:2016-04-29 13:21:53
【问题描述】:

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

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

【问题讨论】:

  • 对于初学者来说,h 数组只有 1 个元素,但您尝试写入其中的 2 个。
  • 由于循环,您正在创建 4 个线程。删除 for 循环并将 h 更改为 'HANDLE h[2];` 以使您的数组足够大以容纳 2 个句柄。
  • @PeteBecker 确实我做到了。恐怕是坏习惯。
  • 如果可以,请使用C++11 Thread Support Library。它提供了一个非常简单的线程 API,它也受益于跨平台。
  • 请不要将代码发布为截图。虽然屏幕截图可以提高问题的质量,但通常可以用纯文本表示的任何内容都应该如此。屏幕截图转义文本搜索。

标签: c++ multithreading winapi


【解决方案1】:

改变这个

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 时,也就是 4 个线程)。
  • 您正试图将这些线程的句柄保存到一个只能容纳一个元素的 HANDLE 数组中。
  • 在第二次执行循环时,您再次覆盖了 h[] 的元素,因此当您稍后等待它们完成并尝试关闭句柄时,您甚至没有关闭同一个句柄。
  • 您需要将 HANDLE 数组的大小设为 2,并且您需要删除第一个 for 循环(您将分别传递函数指针,因此除非将函数指针放入长度与 h[]) 相同的数组。

【讨论】:

  • 您能否详细说明为什么这可以解决问题?
  • 请解释更改,以及为什么原始版本会导致问题。
  • 添加说明。抱歉……新来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2011-09-13
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多