C++多线程:this_thread 命名空间
std::this_thread
是 C++ 标准库中提供的一个命名空间,它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具,使得在多线程环境中更容易进行编程。
源码类似于如下:
namespace std{
namespace this_thread{
//...................
}
}
get_id( )
get_id( )
std::this_thread::get_id()
: 返回当前线程的唯一标识符,类型为 std::thread::id
。可以用来识别不同的线程。
两种方法获取线程ID
方法一: 利用线程名中的API接口获取(推荐)
void myFunction(){
}
int main()
{;
std::thread myThread(myFunction);
std::thread::id myThreadId = myThread.get_id();
cout << "myThreadId: " << myThreadId << endl;
myThread.join();
}
方法二: 在线程函数中利用this_thread返回当前线程的ID
void myFunction(){
// 获取当前线程的ID
std::thread::id threadId = std::this_thread::get_id();
std::cout << "Thread ID inside myFunction: " << threadId << std::endl;
};
int main()
{
// 创建线程
std::thread myThread(myFunction);
//等待线程执行完成
myThread.join();
// 获取当前主线程的ID
std::thread::id mainThreadId = std::this_thread::get_id();
std::cout << "Main Thread ID: " << mainThreadId << std::endl;
}
yield( )
std::this_thread::yield() 是 C++ 标准库中的一个函数,它的作用是让当前线程放弃其执行权,主动让出 CPU 时间片,以便其他线程有机会执行。具体来说,yield() 函数的调用会导致当前线程进入就绪态,允许调度器在就绪线程中选择另一个线程来执行。
这个函数的原型如下:
namespace std {
namespace this_thread {
void yield() noexcept;
}
}
使用 yield()
的主要场景是在多线程编程中,当一个线程希望让出 CPU 执行权,以便其他线程能够执行。这样可以更好地利用系统资源,提高多线程程序的效率。以下是一个简单的示例,演示了 yield()
的基本用法:
#include <iostream>
#include <thread>
void worker() {
for (int i = 0; i < 5; ++i) {
std::cout << "Worker: " << i << std::endl;
std::this_thread::yield(); // 让出执行权
}
}
int main() {
std::thread workerThread(worker);
for (int i = 0; i < 5; ++i) {
std::cout << "Main: " << i << std::endl;
std::this_thread::yield(); // 让出执行权
}
workerThread.join();
return 0;
}
sleep_for()
std::this_thread::sleep_for(): 让当前线程休眠一段指定的时间。
#include <iostream>
#include <chrono>
int main() {
std::cout << "Sleep for 2 seconds...\n";
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Awake!\n";
return 0;
}
std::chrono
是C++11提供的时间库(更具体说它也是一个命名空间,它的库头文件名和命名空间名称相同)。库中的核心组件是持续时间(duration),它是时间段的表示。持续时间可以以秒、毫秒、微秒等不同单位表示。例如,std::chrono::seconds表示以秒为单位的时间段,而std::chrono::milliseconds和std::chrono::microseconds分别表示毫秒和微秒。
原型如下:
namespace std {
namespace chrono{
..............
}
}
std是一级命名空间,chrono是二级命名空间。
sleep_until( )
std::this_thread::sleep_until()
用于让当前线程休眠直到指定的时间点。该函数接受一个表示时间点的参数,并在当前线程休眠直到达到或超过该时间点。使用 sleep_until()
可以在程序中实现对时间的精确控制。
以下是 sleep_until()
函数的原型:
namespace std {
namespace this_thread {
template<class Clock, class Duration>
void sleep_until(const chrono::time_point<Clock, Duration>& sleep_time);
}
}
sleep_until()
接受一个时间点参数,其中 Clock
表示时钟类型,Duration
表示时间间隔类型。通常,Clock
和 Duration
会使用 std::chrono
命名空间中的类型。
下面是一个示例,演示如何使用 sleep_until()
将当前线程休眠至指定时间点:
在这个例子中,sleep_until()
被用来休眠当前线程至指定的时间点。首先获取了当前时间点 now
,然后计算了一个未来的时间点 sleep_time
(当前时间点之后的5秒),最后通过 sleep_until()
函数实现线程的休眠。
#include <iostream>
#include <thread>
#include <chrono>
int main() {
// 获取当前时间点
auto now = std::chrono::system_clock::now();
// 设置休眠时间为当前时间点之后的5秒
auto sleep_time = now + std::chrono::seconds(5);
std::cout << "Sleeping until: " << std::chrono::system_clock::to_time_t(sleep_time) << std::endl;
// 休眠至指定时间点
std::this_thread::sleep_until(sleep_time);
std::cout << "Awake!" << std::endl;
return 0;
}
打印输出:
std::chrono::system_clock::to_time_t(sleep_time)
:将时间点转为时间戳(距离1970年1月1日零时零分零秒的间隔秒数)