Тебе же нужно как раз, чтобы все функции разделяли этот объект. Если передать по значению, тогда вызов cancel() на одном из них, на состояние другого никак не повлияет.
Добавлено через 7 минут и 34 секунды вот пример в примитивном виде.
| Код | #include <iostream> #include <thread> #include <atomic>
class cancellation_token { public: cancellation_token() :cancellation_requested_(false) { }
bool is_cancellation_requested() const { return cancellation_requested_.load(std::memory_order_acquire); }
void cancel() { cancellation_requested_.store(true, std::memory_order_release); } private: std::atomic_bool cancellation_requested_; };
void process(cancellation_token& token) { static int x = 0; while (!token.is_cancellation_requested()) { std::cout << "x = " << ++x << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } }
int main() { cancellation_token token; std::thread th(process, std::ref(token)); std::cin.get(); token.cancel(); th.join(); }
|
|