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

时间:2017-03-15 10:19:44

标签: c++ multithreading c++11 stdthread

我想使用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()是否正常工作。

2 个答案:

答案 0 :(得分:5)

在C ++中没有“嵌套”或“子”线程这样的东西,操作系统模型不会立即映射到C ++。可以更准确地描述C ++模型threads of execution being associated with thread objects

来自链接的cppreference;

  

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

可以根据需要移动

thread个对象(std::move);它确实是一个所有权问题,在join()对象超出范围之前需要thread。{/ p>

回答问题;

  

我可以安全地这样做吗?

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

  

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

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

旁注;我确定innerfunc仅用于演示,但cout可能无法按预期进行同步。输出将是“乱码”。

答案 1 :(得分:0)

一切正常!只需为所有“ 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;
}