2016-09-01 1 views
0

이유는 무엇입니까? Emplace 백 그라디언트 벡터

#include <iostream> 
#include <thread> 
#include <vector> 

std::vector<std::thread> threads(3); 

void task() { std::cout<<"Alive\n";} 
void spawn() { 
     for(int i=0; i<threads.size(); ++i) 
       //threads[i] = std::thread(task); 
       threads.emplace_back(std::thread(task)); 

     for(int i=0; i<threads.size(); ++i) 
       threads[i].join(); 
} 

int main() { 
     spawn(); 
} 

내가 주석 라인 스레드로 스레드를 만들 경우

는 복사/고운 그래서 할당을 이동하지만, 자리에 스레드를 생성 할 때 왜 작동하지입니까?

+0

는 "작동하지 않는"와 "정의되지 않은 행동"에 대해 더 구체적으로하시기 바랍니다. 또한 개체를 현재 위치에서 생성하려면 (즉, 완전히 elliding 복사본) threads.emplace_back (task)을 수행해야합니다. – Dmitry

+1

참여하려는 스레드가 결합 할 수 없습니다. C++에 대한 일반적인 조언은 항상 그렇듯이 더 복잡한 작업을하기 전에 * int와 std :: vector 을 완전히 이해했는지 확인해야합니다. 문제가 해결 될 때까지 이동하지 말고 문제가있을 때마다 먼저 int 또는 std :: vector 중 하나로 줄이십시오. –

답변

4

3 개의 기본 스레드를 구성하고 다른 3 개의 스레드를 추가하는 코드에서 어떤 현상이 발생하고 있습니까?

변경 :

std::vector<std::thread> threads; 
const size_t number_of_threads=3; 

int main(){ 
    threads.reserve(number_of_threads); 
    spawn(); 
} 

그리고 spwan 내부 :

std::vector<std::thread> threads(3); 

으로

void spawn() { 
    for(int i=0; i<number_of_threads; ++i){ 
     threads.emplace_back(std::thread(task)); 
    } 
    for(int i=0; i<threads.size(); ++i){ 
     threads[i].join(); 
    } 
} 

당신이 emplace_back 또는 psuh_back를 사용하고, 당신이 전에 메모리를 할당해야합니다. 당신은 단지 reserve이어야합니다. BTW

, 당신은 emplace_back하지를 사용하고 있기 때문에 push_back 직접 작성할 수 있습니다

threads.emplace_back(task); 
+0

용량을 예약 했음에도 불구하고 threads.size()는 여전히 0을 반환하고 threads.capacity()는 임의의 숫자> = 3을 반환 할 수 있습니다. 따라서 spawn()의 첫 번째 루프는 동일한 값 동일한 변수 또는 상수)가 reserve()로 전달되었습니다. 그리고이 특별한 경우에는 reserve()를 호출하는 것으로부터 얻을 수있는 것이 없습니다. – Jeremy

+0

내가 놓친 첫 번째 부분에 대해 옳았습니다. 그러나 실제로 발생할 수있는 재 할당을 거부하는 준비금을 사용함으로써 실제로 이익이 발생합니다. –

+1

구현시 벡터가 사용자가 예약 한 크기보다 작은 증분으로 증가하는 경우에만 -이 경우에는 거의 불가능합니다. – Jeremy

관련 문제