C ++ Multi-threading anlamaya çalışıyorum, ama ben bu sorun sıkışmış: Eğer bir for döngüsünde iş parçacıkları başlatmak yanlış değerler yazdırın. Bu kod:
#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 değerlerini yazdırmayı bekliyordum ama çoğu kez aynı değeri iki kez aldım. Bu çıktı:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
Ne eksik?
emplace_back
tuhaf olduğunu belirtmek gerekir : emplace_back
argümanların bir listesini alır ve bunu bir kurucuya iletir std::thread
. Bir (rvalue) örneğini geçtiniz std::thread
, bu nedenle bir iş parçacığı oluşturacak ve daha sonra bu iş parçacığını vektör içine taşıyacaksınız. Bu işlem daha yaygın yöntemle daha iyi ifade edilir push_back
. Biraz daha deyimsel olan yazmak threads.emplace_back([i](){ print_id(i); });
(yerinde inşa etmek) veya threads.push_back(std::thread([i](){ print_id(i); }));
(inşa etmek + taşımak) daha mantıklı olurdu .
i
göre lambda'ya geç[i]
.