Tôi đang cố gắng hiểu Đa luồng trong c ++, nhưng tôi bị mắc kẹt trong vấn đề này: nếu tôi khởi chạy các luồng trong một vòng lặp for thì chúng in sai các giá trị. Đây là mã:
#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;
}
Tôi đã mong đợi được in các giá trị 0,1,2,3,4 nhưng tôi thường nhận được cùng một giá trị hai lần. Đây là đầu ra:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
Tôi đang thiếu gì?
emplace_back
là kỳ quặc: emplace_back
lấy một danh sách các đối số và chuyển nó cho một nhà xây dựng cho std::thread
. Bạn đã thông qua một ví dụ (giá trị) của std::thread
, do đó sẽ xây dựng một luồng, sau đó di chuyển luồng đó vào vector. Hoạt động đó được thể hiện tốt hơn bằng phương pháp phổ biến hơn push_back
. Sẽ hợp lý hơn khi viết threads.emplace_back([i](){ print_id(i); });
(xây dựng tại chỗ) hoặc threads.push_back(std::thread([i](){ print_id(i); }));
(xây dựng + di chuyển) có phần thành ngữ hơn.
i
theo giá trị cho lambda[i]
,.