আমি সি ++ এ মাল্টি-থ্রেডিং বোঝার চেষ্টা করছি, তবে আমি এই সমস্যায় আটকে আছি: আমি যদি লুপের জন্য থ্রেড চালু করি তবে তারা ভুল মানগুলি মুদ্রণ করে। এই কোড:
#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],।