std::this_thread 命名空间
std::this_thread
问题1: std::this_thread 命名空间下都有哪些线程操作
std::this_thread 是 C++11 引入的,专门用于操作当前执行的线程,提供了一系列简洁实用的接口。
一、std::this_thread 核心操作详解
std::this_thread 所有接口都定义在 <thread> 头文件中,核心操作分为以下几类:
1. 获取当前线程 ID:get_id()
- 功能:返回当前线程的唯一标识符(类型为
std::thread::id)。 - 用途:调试、日志记录、区分不同线程、判断线程是否为主线程等。
- 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void thread_func(int num) {
// 获取当前线程ID并打印
std::cout << "线程 " << num << " 的ID: " << std::this_thread::get_id() << std::endl;
}
int main() {
std::cout << "主线程ID: " << std::this_thread::get_id() << std::endl;
std::vector<std::thread> threads;
for (int i = 0; i < 3; ++i) {
threads.emplace_back(thread_func, i);
}
for (auto& t : threads) {
t.join();
}
return 0;
} - 输出示例(ID 为系统分配,每次运行可能不同):
1
2
3
4主线程ID: 1407092608
线程 0 的ID: 1407092320
线程 1 的ID: 1407092236
线程 2 的ID: 1407092152
2. 线程休眠:sleep_for()
- 功能:让当前线程休眠指定的时间段,休眠期间线程不占用 CPU 资源。
- 参数:
std::chrono类型的时间间隔(如std::chrono::seconds、std::chrono::milliseconds)。 - 示例代码:
1
2
3
4
5
6
7
8
9
10
11
int main() {
std::cout << "开始休眠..." << std::endl;
// 休眠 2 秒 + 500 毫秒
std::this_thread::sleep_for(std::chrono::seconds(2) + std::chrono::milliseconds(500));
std::cout << "休眠结束!" << std::endl;
return 0;
}
3. 线程休眠到指定时间点:sleep_until()
- 功能:让当前线程休眠直到指定的时间点,而非固定时长(适合需要精准到某个时间执行的场景)。
- 参数:
std::chrono::time_point类型的时间点(如系统时钟的某个时刻)。 - 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
// 获取当前系统时间 + 3 秒,作为休眠结束的时间点
auto wake_up_time = std::chrono::system_clock::now() + std::chrono::seconds(3);
std::cout << "休眠到指定时间点..." << std::endl;
std::this_thread::sleep_until(wake_up_time);
std::cout << "到达时间点,休眠结束!" << std::endl;
return 0;
}
4. 线程让步:yield()
- 功能:主动让当前线程放弃 CPU 执行权,提示操作系统调度器优先调度其他就绪线程(但操作系统不一定采纳)。
- 用途:避免单个线程长时间占用 CPU(如循环等待某个条件时),提升多线程并发效率。
- 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void busy_wait() {
int count = 0;
while (count < 1000000) {
++count;
// 每循环一次就让步,给其他线程执行机会
std::this_thread::yield();
}
std::cout << "循环结束,当前线程ID: " << std::this_thread::get_id() << std::endl;
}
int main() {
std::thread t1(busy_wait);
std::thread t2(busy_wait);
t1.join();
t2.join();
return 0;
}
二、注意事项
sleep_for()/sleep_until()可能会被系统信号中断,导致实际休眠时间短于预期(C++11 及以上可通过返回值判断,但部分编译器未实现)。yield()仅为“提示”,不能保证其他线程一定被调度,不要依赖它实现精准的线程同步(同步应使用std::mutex/std::condition_variable)。- 所有
std::this_thread操作仅作用于当前线程,无法操作其他线程(操作其他线程需通过std::thread对象)。
总结
std::this_thread 的核心操作可归纳为 4 类,重点如下:
get_id():获取当前线程的唯一 ID,用于标识和区分线程;sleep_for()/sleep_until():让当前线程休眠(固定时长/指定时间点);yield():主动让步 CPU,提升多线程并发效率;- 所有操作均需包含
<thread>头文件,且仅作用于当前执行的线程。
问题2: 与c中的sleep()函数区别
C++ 的 std::this_thread::sleep_for 与 C 语言的 sleep 函数有以下主要区别:
参数类型
- **C++
std::this_thread::sleep_for**:使用std::chrono::duration类型,如std::chrono::seconds(5) - **C
sleep**:使用整数类型,表示秒数
精度控制
- C++ 版本:支持多种时间精度(纳秒、微秒、毫秒、秒等)
- C 版本:通常只支持秒级精度
使用示例对比
1 | // C++ 方式 |
1 | // C 方式 |
类型安全
- C++ 版本:类型安全,编译时检查时间单位
- C 版本:类型不安全,容易混淆时间单位
标准库归属
- C++ 版本:属于
<thread>头文件 - C 版本:属于 POSIX 标准,
<unistd.h>头文件
总结:C++ 版本提供了更好的类型安全和更精细的时间控制能力,而 C 版本简单直接但精度较低。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 naro!




