C++ 中的 std::thread 库是不是支持嵌套线程?

Posted

技术标签:

【中文标题】C++ 中的 std::thread 库是不是支持嵌套线程?【英文标题】:Does std::thread library in C++ support nested threading?C++ 中的 std::thread 库是否支持嵌套线程? 【发布时间】:2017-03-15 10:19:44 【问题描述】:

我想使用像这样的std::thread 库在 C++ 中创建嵌套线程。

#include<iostream>
#include<thread>
#include<vector>
using namespace std;

void innerfunc(int inp)

    cout << inp << endl;

void outerfunc(int inp)

    thread * threads = new thread[inp];
    for (int i = 0; i < inp; i++)
        threads[i] = thread(innerfunc, i);
    for (int i = 0; i < inp; i++)
        threads[i].join();
    delete[] threads;

int main()

     int inp = 0;
     thread t1 = thread(outerfunc,2);
     thread t2 = thread(outerfunc,3);
     t1.join();
     t2.join();

我可以安全地执行此操作吗?我担心join() 是否正常工作。

【问题讨论】:

无关,我会先好好利用神秘包含但从未使用过的&lt;vector&gt;,而不是自己管理动态分配。 “安全”是什么意思? “正常工作”与“正常工作”有何不同? 我不明白你所说的“嵌套线程”是什么意思——什么是嵌套? 这并不能解决问题,但不要使用std::endl,除非您需要它所做的额外内容。 '\n' 结束一行。 【参考方案1】:

C++ 中并没有真正意义上的“嵌套”或“子”线程,操作系统模型不会立即映射到 C++。 C++ 的模型更准确地描述为threads of execution being associated with thread objects。

来自链接的 cppreference;

类线程代表单个执行线程。

thread 对象可以根据需要移动(std::move);这实际上更多是所有权问题,谁需要在对象超出范围之前join() thread

回答问题;

我可以安全地做到这一点吗?

是的。执行线程(及其关联的thread 对象)可以在“嵌套”线程中创建并成功执行。

我担心join() 是否正常工作。

是的,它会的。这与线程的“所有权”有关。只要在thread 对象超出范围之前加入执行线程,它就会按预期工作。


附带说明;我确定innerfunc 仅用于演示,但cout 可能不会按预期同步。输出会“乱码”。

【讨论】:

我不认为“子线程”是一回​​事。就 C++ 线程模型而言,线程之间没有关系。所有线程都是平等的,任何一个线程都可以加入任何其他线程。 正确,但 OP 的措辞是“嵌套”线程,暗示他的内部逻辑正在订购这些。我将对此添加一些注释。 当然,这里的全部问题是 OP 正遭受毫无根据的误解。我想我的意思是,如果有意义的话,答案可能应该从 那里 开始,而不是通过遵循 OP 的规则并探索不存在的概念。 正确。我将从这个答案开始。【参考方案2】:

一切正常!只需为所有“cout”语句添加一个锁。否则数值会乱码。

mutex m;

void innerfunc(int inp)

    m.lock();
    cout <<"Innerfunc triggered " << inp << endl;
    m.unlock();


void outerfunc(int inp)

    m.lock();
    cout <<"Outerfunc triggered " << inp << endl;
    m.unlock();
    thread * threads = new thread[inp];
    for (int i = 0; i < inp; i++)
        threads[i] = thread(innerfunc, i);
    for (int i = 0; i < inp; i++)
        threads[i].join();
    delete[] threads;

【讨论】:

以上是关于C++ 中的 std::thread 库是不是支持嵌套线程?的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::thread概念介绍

使用 std::thread 在 C++ 中的单独线程中执行每个对象

是否有任何理由应该将 C++ 11+ std::mutex 声明为全局变量,而不是作为函数参数传递给 std::thread ?

C++ 多线程std::thread 详解

C++ 多线程std::thread 详解

两种 C++ 多线程编程方式,看完不懂打我...