मैं सी + + में मल्टी-थ्रेडिंग को समझने की कोशिश कर रहा हूं, लेकिन मैं इस समस्या में फंस गया हूं: अगर मैं थ्रेड को लूप में लॉन्च करता हूं तो वे गलत मान लेते हैं। यह कोड है:
#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। आपने (रवेल) उदाहरण पास किया है std::thread, इसलिए एक थ्रेड का निर्माण करेंगे, फिर उस थ्रेड को वेक्टर में ले जाएँ। यह ऑपरेशन अधिक सामान्य विधि द्वारा बेहतर ढंग से व्यक्त किया गया है push_back। यह या तो लिखने के लिए अधिक समझदार होगा threads.emplace_back([i](){ print_id(i); });(जगह में निर्माण) या threads.push_back(std::thread([i](){ print_id(i); }));(निर्माण + चाल) जो कुछ हद तक अधिक मुहावरेदार हैं।
i, लैम्ब्डा के लिए मूल्य द्वारा[i]।