管理当前线程的主要API
函数名 | C++ 标准 | 作用 | 典型使用场景 |
---|---|---|---|
std::this_thread::yield | C++11 | 让出当前线程的处理器使用权,允许调度器运行其他线程。 | 在多线程程序中避免忙等待,释放 CPU 给其他线程使用。 |
std::this_thread::get_id | C++11 | 获取当前线程的唯一标识符。 | 用于调试、日志记录或识别线程。 |
std::this_thread::sleep_for | C++11 | 暂停当前线程的执行一段指定的时间。 | 定时任务、控制任务执行频率,或等待资源准备好(非忙等待)。 |
std::this_thread::sleep_until | C++11 | 暂停当前线程的执行,直到指定的时间点。 | 用于精确的任务调度或同步操作,例如定时启动任务。 |
示例代码
下面的代码展示了如何使用这些 API:
#include <iostream>
#include <thread>
#include <chrono>
void exampleFunction() {
// 获取当前线程 ID
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
// 暂停当前线程 1 秒
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Resuming after 1 second." << std::endl;
// 暂停当前线程到一个时间点
auto wake_time = std::chrono::steady_clock::now() + std::chrono::seconds(2);
std::this_thread::sleep_until(wake_time);
std::cout << "Resuming after waiting until a specific time." << std::endl;
// 让出处理器使用权
std::this_thread::yield();
std::cout << "Yielded processor time to other threads." << std::endl;
}
int main() {
std::thread t(exampleFunction);
t.join();
return 0;
}
让出处理器使用权的使用场景
- 避免忙等待:当线程需要等待某个条件时,通过
yield
可以减少对 CPU 的占用。
while (!condition_met()) {
std::this_thread::yield();
}
- 提高公平性:在多线程环境中,主动让出 CPU 可以让其他线程有机会执行,避免资源占用不均。
- 多线程调试和优化:在需要显式控制线程行为的场景中,
yield
提供了简单的方法来调整线程调度。
与 sleep_for
和 sleep_until
的对比
-
std::this_thread::yield
:- 让出 CPU 使用权,但不会阻塞线程。
- 当前线程会立即重新参与调度。
- 适合短时间暂停。
-
std::this_thread::sleep_for
和sleep_until
:- 暂停线程指定时间,不再参与调度。
- 当前线程会真正进入等待状态,释放 CPU。
- 适合明确的延迟操作。