C++ std::this_thread::yield()函数(线程抑制、线程让步、让出时间片)volatile
linux c++ std::this_thread::yield()函数(线程抑制、线程让步、让出时间片)volatile
文章目录
mancpp std::this_thread::yield
std::this_thread::yield(3) C++ Programmer's Manual std::this_thread::yield(3)
NAME
std::this_thread::yield - Yield to other threads
TYPE
function
SYNOPSIS
#include <thread>
void yield() noexcept;
DESCRIPTION
The calling thread yields, offering the implementation the opportunity to reschedule.
This function shall be called when a thread waits for other threads to advance without blocking.
//调用线程让步,为实现提供重新调度的机会。
//当一个线程等待其他线程无阻塞地前进时,应调用此函数。
PARAMETERS
none
RETURN VALUE
none
EXAMPLE
// this_thread::yield example
#include <iostream> // std::cout
#include <thread> // std::thread, std::this_thread::yield
#include <atomic> // std::atomic
std::atomic<bool> ready (false);
void count1m(int id) {
while (!ready) { // wait until main() sets ready...
std::this_thread::yield();
}
for (volatile int i=0; i<1000000; ++i) {}
std::cout << id;
}
int main ()
{
std::thread threads[10];
std::cout << "race of 10 threads that count to 1 million:\n";
for (int i=0; i<10; ++i) threads[i]=std::thread(count1m,i);
ready = true; // go!
for (auto& th : threads) th.join();
std::cout << '\n';
return 0;
}
Possible output (last line may vary):
race of 10 threads that count to 1 million...
6189370542
EXCEPTION SAFETY
No-throw guarantee: never throws exceptions.
SEE ALSO
sleep_until(3)
Sleep until time point (function)
sleep_for(3)
Sleep for time span (function)
REFERENCE
cplusplus.com, 2000-2015 - All rights reserved.
cplusplus.com 2022-05-13 std::this_thread::yield(3)
(END)
文章目录
20230816
C++ std::this_thread::yield() 函数:掌控线程调度
在多线程编程解并有效利用线程让步的概念是至关重要的。本文将深入探讨C++中std::this_thread::yield()函数的作用和应用场景,并介绍其在volatile
上下文中的使用。
目录
- std::this_thread::yield() 概述
- std::this_thread::yield() 详解
- volatile关键字
- std::this_thread::yield() 在volatile上下文中的应用
- 总结
1. std::this_thread::yield() 概述
std::this_thread::yield() 是C++11标准库提供的一种线程让步的方法,它被定义在头文件中。这个函数告诉操作系统当前线程愿意放弃剩余的时间片,以便其他线程有机会执行。当然,操作系统是否接受这个建议取决于具体的调度策略。
#include <thread>
void foo()
{
// some code here
std::this_thread::yield(); // 让出CPU给其他线程
// some code here
}
2. std::this_thread::yield() 详解
std::this_thread::yield() 可以被视为一种优化工具。例如,在旋转锁(spinlock)等待获取锁的情况下,如果一个线程不能立即获取到锁,那么它可以通过yield()来释放CPU,使得持有锁的线程有机会运行,从而更快地释放锁。
2.1 使用std::this_thread::yield()
以下示例展示了如何在spinlock中使用yield():
#include <atomic>
#include <thread>
std::atomic<bool> lock(false);
void thread_func()
{
while (lock.exchange(true, std::memory_order_acquire))
std::this_thread::yield();
// critical section
lock.store(false, std::memory_order_release);
}
2.2 yield() 和 sleep() 的区别
虽然std::this_thread::yield() 和 std::this_thread::sleep_for() 都可以用于暂停当前线程,但它们的含义和应用场景完全不同。yield()只是建议操作系统切换到其他线程,而sleep_for()则确保当前线程在指定的时间段内处于休眠状态。
3. volatile关键字
在C++中,volatile
是一个类型修饰符,用于告诉编译器不对所修饰的对象进行任何形式的优化。换言之,每次访问volatile
变量都必须直接从其所在的内存位置读取,而不能依赖可能存在的寄存器副本。
3.1 volatile示例
下面是一个简单的volatile变量的例子:
volatile int x = 0;
4. std::this_thread::yield() 在volatile上下文中的应用
在处理与硬件相关的代码或多线程共享数据时,我们可能需要使用volatile和std::this_thread::yield()。以下示例说明了如何结合使用这两个工具:
#include <thread>
#include <iostream>
volatile bool data_ready = false;
void producer() {
// 做一些工作...
data_ready = true; // 数据已经准备好
}
void consumer() {
while (!data_ready) // 等待数据准备好
std::this_thread::yield();
// 处理数据...
std::cout << "Data processed.\n";
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
5. 总结
C++的std::this_thread::yield()和volatile关键字都是并发编程中的重要工具。std::this_thread::yield()允许开发者向操作系统发出“让步”的信号,从而可能使其他线程有机会执行。volatile关键字则禁止编译器对特定变量进行优化,确保每次访问都是最新的值。当二者结合使用时,可以帮助我们更好地控制线程间的交互。
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
更多推荐
所有评论(0)