ฉันพยายามที่จะเข้าใจ Multi-Threading ใน c ++ แต่ฉันติดอยู่กับปัญหานี้: ถ้าฉันเริ่มใช้เธรดในลูปพวกเขาพิมพ์ค่าผิด นี่คือรหัส:
#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]