GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::stop_callback(3) C++ Standard Libary std::stop_callback(3)

std::stop_callback - std::stop_callback


Defined in header <stop_token>
template< class Callback > (since C++20)
class stop_callback;


The stop_callback class template provides an RAII object type that registers a
callback function for an associated std::stop_token object, such that the callback
function will be invoked when the std::stop_token's associated std::stop_source is
requested to stop.


Callback functions registered via stop_callback's constructor are invoked either in
the same thread that successfully invokes request_stop() for a std::stop_source of
the stop_callback's associated std::stop_token; or if stop has already been
requested prior to the constructor's registration, then the callback is invoked in
the thread constructing the stop_callback.


More than one stop_callback can be created for the same std::stop_token, from the
same or different threads concurrently. No guarantee is provided for the order in
which they will be executed, but they will be invoked synchronously; except for
stop_callback(s) constructed after stop has already been requested for the
std::stop_token, as described previously.


If an invocation of a callback exits via an exception then std::terminate is called.


std::stop_callback is not CopyConstructible, CopyAssignable, MoveConstructible, nor
MoveAssignable.


The template param Callback type must be both invocable and destructible. Any return
value is ignored.


Type Definition
callback_type Callback


constructor constructs new stop_callback object
(public member function)
destructor destructs the stop_callback object
(public member function)
operator= stop_callback is not assignable
[deleted] (public member function)


Deduction guides

// Run this code


#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>


using namespace std::chrono_literals;


// Use a helper class for atomic std::cout streaming
class Writer
{
std::ostringstream buffer;
public:
~Writer() {
std::cout << buffer.str();
}
Writer& operator<<(auto input) {
buffer << input;
return *this;
}
};


int main()
{
// A worker thread
// It will wait until it is requested to stop.
std::jthread worker([] (std::stop_token stoken) {
Writer() << "Worker thread's id: " << std::this_thread::get_id() << '\n';
std::mutex mutex;
std::unique_lock lock(mutex);
std::condition_variable_any().wait(lock, stoken,
[&stoken] { return stoken.stop_requested(); });
});


// Register a stop callback on the worker thread.
std::stop_callback callback(worker.get_stop_token(), [] {
Writer() << "Stop callback executed by thread: "
<< std::this_thread::get_id() << '\n';
});


// stop_callback objects can be destroyed prematurely to prevent execution
{
std::stop_callback scoped_callback(worker.get_stop_token(), [] {
// This will not be executed.
Writer() << "Scoped stop callback executed by thread: "
<< std::this_thread::get_id() << '\n';
});
}


// Demonstrate which thread executes the stop_callback and when.
// Define a stopper function
auto stopper_func = [&worker] {
if(worker.request_stop())
Writer() << "Stop request executed by thread: "
<< std::this_thread::get_id() << '\n';
else
Writer() << "Stop request not executed by thread: "
<< std::this_thread::get_id() << '\n';
};


// Let multiple threads compete for stopping the worker thread
std::jthread stopper1(stopper_func);
std::jthread stopper2(stopper_func);
stopper1.join();
stopper2.join();


// After a stop has already been requested,
// a new stop_callback executes immediately.
Writer() << "Main thread: " << std::this_thread::get_id() << '\n';
std::stop_callback callback_after_stop(worker.get_stop_token(), [] {
Writer() << "Stop callback executed by thread: "
<< std::this_thread::get_id() << '\n';
});
}


Worker thread's id: 140460265039616
Stop callback executed by thread: 140460256646912
Stop request executed by thread: 140460256646912
Stop request not executed by thread: 140460248254208
Main thread: 140460265043776
Stop callback executed by thread: 140460265043776

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.