Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/thread/stop source"

From cppreference.com
< cpp‎ | thread
m (fmt, std::stop_source & -> std::stop_source&)
(Better to pass stop_token instead of stop_source to wroker thread function)
 
(One intermediate revision by one user not shown)
Line 31: Line 31:
 
{{dsc end}}
 
{{dsc end}}
  
===Helper constants===
+
===Helper tags===
 
{{dsc begin}}
 
{{dsc begin}}
 
{{dsc inc|cpp/thread/stop_source/dsc nostopstate}}
 
{{dsc inc|cpp/thread/stop_source/dsc nostopstate}}
{{dsc end}}
 
 
===Helper classes===
 
{{dsc begin}}
 
{{dsc inc|cpp/thread/stop_source/dsc nostopstate_t}}
 
 
{{dsc end}}
 
{{dsc end}}
  
Line 58: Line 53:
 
using namespace std::chrono_literals;
 
using namespace std::chrono_literals;
  
void worker_fun(int id, std::stop_source stop_source)
+
void worker_fun(int id, std::stop_token stoken)
{
+
{  
    std::stop_token stoken = stop_source.get_token();
+
 
     for (int i = 10; i; --i)
 
     for (int i = 10; i; --i)
 
     {
 
     {
Line 91: Line 85:
 
     // Create worker threads
 
     // Create worker threads
 
     for (int i = 0; i < 4; ++i)
 
     for (int i = 0; i < 4; ++i)
         threads[i] = std::jthread(worker_fun, i + 1, stop_source);
+
         threads[i] = std::jthread(worker_fun, i + 1, stop_source.get_token());
  
 
     std::this_thread::sleep_for(500ms);
 
     std::this_thread::sleep_for(500ms);

Latest revision as of 10:31, 16 July 2024

 
 
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
(C++11)
Cooperative cancellation
(C++20)
stop_source
(C++20)
Mutual exclusion
(C++11)
Generic lock management
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Safe Reclamation
(C++26)
Hazard Pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11)(deprecated in C++20)
(C++11)(deprecated in C++20)
Memory ordering
Free functions for atomic operations
Free functions for atomic flags
 
 
Defined in header <stop_token>
class stop_source;
(since C++20)

The stop_source class provides the means to issue a stop request, such as for std::jthread cancellation. A stop request made for one stop_source object is visible to all stop_sources and std::stop_tokens of the same associated stop-state; any std::stop_callback(s) registered for associated std::stop_token(s) will be invoked, and any std::condition_variable_any objects waiting on associated std::stop_token(s) will be awoken.

Once a stop is requested, it cannot be withdrawn. Additional stop requests have no effect.

Contents

[edit] Member functions

constructs new stop_source object
(public member function) [edit]
destructs the stop_source object
(public member function) [edit]
assigns the stop_source object
(public member function) [edit]
Modifiers
makes a stop request for the associated stop-state, if any
(public member function) [edit]
swaps two stop_source objects
(public member function) [edit]
Observers
returns a stop_token for the associated stop-state
(public member function) [edit]
checks whether the associated stop-state has been requested to stop
(public member function) [edit]
checks whether associated stop-state can be requested to stop
(public member function) [edit]

[edit] Non-member functions

compares two std::stop_source objects
(function) [edit]
specializes the std::swap algorithm
(function) [edit]

[edit] Helper tags

a tag used for stop_source to indicate no associated stop-state upon construction
(tag)[edit]

[edit] Notes

For the purposes of std::jthread cancellation the stop_source object should be retrieved from the std::jthread object using get_stop_source(); or stop should be requested directly from the std::jthread object using request_stop(). This will then use the same associated stop-state as that passed into the std::jthread's invoked function argument (i.e., the function being executed on its thread).

For other uses, however, a stop_source can be constructed separately using the default constructor, which creates new stop-state.

Feature-test macro Value Std Feature
__cpp_lib_jthread 201911L (C++20) Stop token and joining thread

[edit] Example

#include <chrono>
#include <iostream>
#include <stop_token>
#include <thread>
 
using namespace std::chrono_literals;
 
void worker_fun(int id, std::stop_token stoken)
{ 
    for (int i = 10; i; --i)
    {
        std::this_thread::sleep_for(300ms);
        if (stoken.stop_requested())
        {
            std::printf("  worker%d is requested to stop\n", id);
            return;
        }
        std::printf("  worker%d goes back to sleep\n", id);
    }
}
 
int main()
{
    std::jthread threads[4];
    std::cout << std::boolalpha;
    auto print = [](const std::stop_source& source)
    {
        std::printf("stop_source stop_possible = %s, stop_requested = %s\n",
                    source.stop_possible() ? "true" : "false",
                    source.stop_requested() ? "true" : "false");
    };
 
    // Common source
    std::stop_source stop_source;
 
    print(stop_source);
 
    // Create worker threads
    for (int i = 0; i < 4; ++i)
        threads[i] = std::jthread(worker_fun, i + 1, stop_source.get_token());
 
    std::this_thread::sleep_for(500ms);
 
    std::puts("Request stop");
    stop_source.request_stop();
 
    print(stop_source);
 
    // Note: destructor of jthreads will call join so no need for explicit calls
}

Possible output:

stop_source stop_possible = true, stop_requested = false
  worker2 goes back to sleep
  worker3 goes back to sleep
  worker1 goes back to sleep
  worker4 goes back to sleep
Request stop
stop_source stop_possible = true, stop_requested = true
  worker3 is requested to stop
  worker1 is requested to stop
  worker2 is requested to stop
  worker4 is requested to stop