2017-03-15 1 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++에 즉시 매핑되지 않습니다. C++의 모델은 threads of execution being associated with thread objects의 행을 따라보다 정확하게 설명됩니다.

링크 된 참조에서;

클래스 스레드는 단일 스레드 실행을 나타냅니다.

thread 개체는 필요에 따라 이동할 수 있습니다 (std::move). 그것은 실제로 소유권의 문제이며 누가 범위를 벗어나기 전에 join()thread 개체를 필요로합니다.

질문에 대한 답변으로;

안전하게 할 수 있습니까?

예. 실행 스레드 (및 연관된 thread 개체)는 "중첩 된"스레드에서 생성되어 성공적으로 실행될 수 있습니다.

join()이 올바르게 작동하는지 궁금합니다.

예. 이것은 스레드의 "소유권"과 관련이 있습니다. thread 개체가 범위를 벗어나기 전에 실행 스레드가 조인되면 원하는대로 작동합니다.


innerfunc은 데모 용이지만, cout은 예상대로 동기화되지 않을 것입니다. 출력이 "왜곡됩니다".

+0

"아이들 스레드"가 문제라고 생각하지 않습니다. 스레드 간의 관계는 C + + 스레딩 모델과 관련이 없습니다. 모든 스레드가 동일하므로 하나의 스레드가 다른 스레드에 참여할 수 있습니다. –

+0

맞음, 그러나 OP는 "중첩 된"쓰레드라고 말하며, 내부 로직이이를 주문한다는 의미입니다. 나는 그것에 몇 가지 메모를 추가합니다. – Niall

+0

당연히 모든 문제는 OP가 부당한 오해를 겪고 있다는 것입니다. 내 요점은 OP의 규칙에 따라 놀고 존재하지 않는 개념을 탐구하는 것이 아니라 오히려 대답이 시작되어야한다는 것입니다. –

관련 문제