Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/thread/yield"

From cppreference.com
< cpp‎ | thread
m (Use since= and until= params of {{ddcl}} template.)
m
 
(9 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
{{cpp/title|n=this_thread::|yield}}
 
{{cpp/title|n=this_thread::|yield}}
 
{{cpp/thread/navbar}}
 
{{cpp/thread/navbar}}
{{ddcl | header=thread | since=c++11 | 1=
+
{{ddcl|header=thread|since=c++11|1=
void yield();
+
void yield() noexcept;
 
}}
 
}}
  
Line 12: Line 12:
 
===Return value===
 
===Return value===
 
(none)
 
(none)
 +
 +
===Notes===
 +
The exact behavior of this function depends on the implementation, in particular on the mechanics of the OS scheduler in use and the state of the system. For example, a first-in-first-out realtime scheduler ({{tt|SCHED_FIFO}} in Linux) would suspend the current thread and put it on the back of the queue of the same-priority threads that are ready to run, and if there are no other threads at the same priority, {{tt|yield}} has no effect.
  
 
===Example===
 
===Example===
{{example |
+
{{example
| p=true
+
|code=
| code=
+
#include <iostream>
+
 
#include <chrono>
 
#include <chrono>
 +
#include <iostream>
 
#include <thread>
 
#include <thread>
  
Line 27: Line 29:
 
     auto start = std::chrono::high_resolution_clock::now();
 
     auto start = std::chrono::high_resolution_clock::now();
 
     auto end = start + us;
 
     auto end = start + us;
     do {
+
     do
 +
    {
 
         std::this_thread::yield();
 
         std::this_thread::yield();
     } while (std::chrono::high_resolution_clock::now() < end);
+
     }
 +
    while (std::chrono::high_resolution_clock::now() < end);
 
}
 
}
  
Line 43: Line 47:
 
               << " microseconds\n";
 
               << " microseconds\n";
 
}
 
}
| output=
+
|p=true
 +
|output=
 
waited for 128 microseconds
 
waited for 128 microseconds
 
}}
 
}}
  
[[de:cpp/thread/yield]]
+
===See also===
[[es:cpp/thread/yield]]
+
{{dsc begin}}
[[fr:cpp/thread/yield]]
+
{{dsc see c|c/thread/thrd_yield}}
[[it:cpp/thread/yield]]
+
{{dsc end}}
[[ja:cpp/thread/yield]]
+
 
[[pt:cpp/thread/yield]]
+
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}
[[ru:cpp/thread/yield]]
+
[[zh:cpp/thread/yield]]
+

Latest revision as of 02:35, 7 October 2024

 
 
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
yield
(C++11)
(C++11)
Cooperative cancellation
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 <thread>
void yield() noexcept;
(since C++11)

Provides a hint to the implementation to reschedule the execution of threads, allowing other threads to run.

Contents

[edit] Parameters

(none)

[edit] Return value

(none)

[edit] Notes

The exact behavior of this function depends on the implementation, in particular on the mechanics of the OS scheduler in use and the state of the system. For example, a first-in-first-out realtime scheduler (SCHED_FIFO in Linux) would suspend the current thread and put it on the back of the queue of the same-priority threads that are ready to run, and if there are no other threads at the same priority, yield has no effect.

[edit] Example

#include <chrono>
#include <iostream>
#include <thread>
 
// "busy sleep" while suggesting that other threads run 
// for a small amount of time
void little_sleep(std::chrono::microseconds us)
{
    auto start = std::chrono::high_resolution_clock::now();
    auto end = start + us;
    do
    {
        std::this_thread::yield();
    }
    while (std::chrono::high_resolution_clock::now() < end);
}
 
int main()
{
    auto start = std::chrono::high_resolution_clock::now();
 
    little_sleep(std::chrono::microseconds(100));
 
    auto elapsed = std::chrono::high_resolution_clock::now() - start;
    std::cout << "waited for "
              << std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count()
              << " microseconds\n";
}

Possible output:

waited for 128 microseconds

[edit] See also

C documentation for thrd_yield