2017-03-15 41 views
1

我想在C++中使用std::thread這樣的庫創建嵌套線程。在C++中std :: thread庫支持嵌套線程嗎?

#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()是否正常工作。

+4

無關,我想通過把那個神祕,包括但-從不使用''用好,而不是管理動態分配自己開始。 – WhozCraig

+3

「安全」是什麼意思? 「正常工作」與「工作」有什麼不同? –

+1

我不明白「嵌套線程」在這裏的含義 - 什麼是嵌套的? –

回答

5

在C++中並沒有真正的「嵌套」或「兒童」線程,OS模型不會立即映射到C++。沿着threads of execution being associated with thread objects的線條更準確地描述了C++的模型。

從鏈接的cppreference;

類線程表示單個執行線程。

thread對象可以根據需要移動(std::move)它真的更多是一個所有權問題,在超出範圍之前需要對象thread

在回答問題;

我可以安全地做到這一點嗎?

是的。執行線程(及其關聯的thread對象)可以在「嵌套」線程中創建併成功執行。

我很擔心join()能否正常工作。

是的。這與線程的「所有權」有關。只要執行的線程在thread對象超出範圍之前加入,它就會按照您的預期工作。


在旁註中;我確定innerfunc僅用於演示,但cout可能不會按預期同步。輸出將會「亂碼」。

+0

我不認爲「兒童線」是一件事。就C++線程模型而言,線程之間沒有任何關係。所有線程都是相等的,任何一個線程都可以加入任何其他線程。 –

+0

正確,但OP的措辭是「嵌套」的線程,這意味着他的內部邏輯正在排序這些。我會爲此添加一些註釋。 – Niall

+0

當然,這裏的整個問題當然是,OP正遭受着無法理解的錯誤觀念。我想我的觀點是,答案或許應該開始*有*而不是由OP的規則玩,探索不存在的概念,如果是有道理的。 –