有时需要对当前运行的子线程进行一些额外的处理,如:使线程休眠一段时间,再次调度等。C++11标准库提供了管理当前线程的函数,这些函数都定义于命名空间this_thread
1. 获取当前线程的标识符
#include <thread>
inline thread::id std::this_thread::get_id();
// 返回当前线程id
#include <iostream>
#include <thread>
void func()
{
std::cout << "work thread id: " << std::this_thread::get_id() << std::endl;
}
int main()
{
std::thread thread(func);
thread.join();
return 0;
}
2. 线程重新调度
#include <thread>
inline void std::this_thread::yield();
// 使当前线程进入线程队列,重新进行调度,来允许其他线程运行。
// 依赖于底层的系统调度机制和系统状态。
需要注意的是,虽然t1线程重新调度,但是t2线程也不一定能先于t1输出。
3. 线程睡眠
#include <thread>
template<typename _Rep, typename _Period>
inline void std::this_thread::sleep_for(const chrono::duration<_Rep, _Period>& __rtime);
// 只要知道其参数一个时间间隔,后续会介绍这个新时间类
// 可以使当前线程休眠一段时间
template<typename _Clock, typename _Duration>
inline void std::this_thread::sleep_until(const chrono::time_point<_Clock, _Duration>& __atime);
// 只要知道其参数一个时间点,后续会介绍这个新时间类
// 可以使当前线程休眠到某个时间点
#include <iostream>
#include <thread>
// 用到了时间函数, 后续会介绍
// C++14标准的
using namespace std::chrono_literals;
void func()
{
// 2s是一个运算符重载函数,这里表示2秒,且是真实时间,后续会介绍
std::this_thread::sleep_for(2s);
std::cout << "thread 1." << std::endl;
}
int main()
{
std::thread t(func);
t.join();
return 0;
}
这里需要用到新时间类,这个时间类提供了与代码执行时间无关的时间测量(稳定时钟),对于超时是非常重要的,后续会专门谈到。