আপনি যদি সি ++ 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()
এখনও এটির জন্য সম্পাদনা না করে থাকেন তবে তাকে অবশ্যই সংজ্ঞা অনুসারে চলতে হবে। তবে এই যুক্তিটি নিখুঁত হতে পারে।