I have encountered the following situation:
I'm constructing a std::thread
, passing a functions that takes a parameter abort
of type std::atomic<bool> &
. The idea here is that I will set this parameter to true
in the main thread when I want the thread to abort execution (e.g. by breaking out of loop). What I have notices is that this always works I join the thread afterwards but only sometimes works when I detach it (which is what I would rather do because I don't require the value returned by the thread after I have set abort
to true). Why is this? Can I still achieve what I want? I.e. somehow signal the thread to stop execution and then detach it?
Here's a pseudo-example:
std::atomic<bool> abort(false);
std::packaged_task<void()> task(
[&]() {
for (;;) {
if (abort.load())
break;
// do work
}
});
auto future(task.get_future());
std::thread thread(std::move(task));
if (future.wait_for(std::chrono::milliseconds(100)) == std::future_status::timeout) {
abort.store(true);
thread.detach() // abort.load() does not deterministically return true!
// timeout, do something
} else {
thread.join();
// no timeout, do something
}
Aucun commentaire:
Enregistrer un commentaire