আপনি যদি সি ++ 11 ব্যবহার করতে std::asyncএবং std::futureআপনার কাজগুলি চালাতে ইচ্ছুক হন তবে থ্রেডটি এখনও এইভাবে পরিষ্কারভাবে চলছে কিনা তা যাচাই করার wait_forজন্য std::futureআপনি এই কার্যটি ব্যবহার করতে পারেন :
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
auto future = std::async(std::launch::async, [] {
std::this_thread::sleep_for(3s);
return 8;
});
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
auto result = future.get();
}
আপনার যদি অবশ্যই ব্যবহার করতে হয় std::threadতবে আপনি std::promiseভবিষ্যতের কোনও জিনিস পেতে ব্যবহার করতে পারেন :
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::promise<bool> p;
auto future = p.get_future();
std::thread t([&p] {
std::this_thread::sleep_for(3s);
p.set_value(true);
});
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
t.join();
}
এই উদাহরণ দুটিই আউটপুট হবে:
Thread still running
এটি অবশ্যই কারণ টাস্ক শেষ হওয়ার আগে থ্রেডের স্থিতি পরীক্ষা করা হয়।
তবে আবার, অন্যদের ইতিমধ্যে উল্লিখিত মতো এটি করা সহজ হতে পারে:
#include <thread>
#include <atomic>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::atomic<bool> done(false);
std::thread t([&done] {
std::this_thread::sleep_for(3s);
done = true;
});
if (done) {
std::cout << "Thread finished" << std::endl;
} else {
std::cout << "Thread still running" << std::endl;
}
t.join();
}
সম্পাদনা করুন:
এর রয়েছে std::packaged_taskসাথে ব্যবহারের জন্য std::threadব্যবহার না করে একটি ক্লিনার সমাধান জন্য std::promise:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono_literals;
std::packaged_task<void()> task([] {
std::this_thread::sleep_for(3s);
});
auto future = task.get_future();
std::thread t(std::move(task));
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
}
t.join();
}
wait()এটির জন্য প্রত্যাশা করা হয় এবং যদি তাই হয়, আপনি যদিwait()এখনও এটির জন্য সম্পাদনা না করে থাকেন তবে তাকে অবশ্যই সংজ্ঞা অনুসারে চলতে হবে। তবে এই যুক্তিটি নিখুঁত হতে পারে।