C ++에서 멀티 스레딩을 이해하려고 하는데이 문제가 발생했습니다 .for 루프에서 스레드를 시작하면 잘못된 값이 인쇄됩니다. 이것은 코드입니다.
#include <iostream>
#include <list>
#include <thread>
void print_id(int id){
printf("Hello from thread %d\n", id);
}
int main() {
int n=5;
std::list<std::thread> threads={};
for(int i=0; i<n; i++ ){
threads.emplace_back(std::thread([&](){ print_id(i); }));
}
for(auto& t: threads){
t.join();
}
return 0;
}
나는 0,1,2,3,4 값을 인쇄 할 것으로 기대했지만 종종 같은 값을 두 번 얻었습니다. 이것은 출력입니다.
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
내가 뭘 놓친거야?
emplace_back
것이 이상 하다는 것을 주목할 가치가 있습니다 : emplace_back
인수 목록을 가져 와서 생성자에게 넘깁니다 std::thread
. 의 (rvalue) 인스턴스를 전달 std::thread
했으므로 스레드를 생성 한 다음 해당 스레드를 벡터로 이동합니다. 이 작업은보다 일반적인 방법으로 더 잘 표현됩니다 push_back
. 다소 관용적 인 쓰기 threads.emplace_back([i](){ print_id(i); });
(제자리에서 구성) 또는 threads.push_back(std::thread([i](){ print_id(i); }));
(구문 + 이동)하는 것이 더 합리적 입니다.
i
, 람다 값[i]
.