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