c++多线程基础2(命名空间 this_thread)
整理自:zh.cppreference.com/w/cpp/thread
std::this_thread::yield:
定义于头文件 <thread>
函数原型:void yield() noexcept;
此函数的准确性为依赖于实现,特别是使用中的 OS 调度器机制和系统状态。例如,先进先出实时调度器( Linux 的 SCHED_FIFO
)将悬挂当前线程并将它放到准备运行的同优先级线程的队列尾(而若无其他线程在同优先级,则 yield
无效果)
代码:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std; void little_sleep(std::chrono::milliseconds us) {
auto start = std::chrono::high_resolution_clock::now();
auto end = start + us;
do {
std::this_thread::yield();//让出当前时间片
}while(std::chrono::high_resolution_clock::now() < end);
} int main(void) {
auto start = std::chrono::high_resolution_clock::now();//获取当前时间 little_sleep(std::chrono::milliseconds()); auto elapsed = std::chrono::high_resolution_clock::now() - start;//计算执行 little_sleep 所用时间 cout << "waited fo "
<< std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() //将 elapsed 时间周期转化为 milliseconds 并输出
<< " milliseconds\n"; // 输出:
// waited fo 100 milliseconds return ;
}
std::this_thread::get_id:
定义于头文件 <thread>
函数原型:std::thread::id get_id() noexcept;
得到当前线程的 id
代码:
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
using namespace std; std::mutex g_display_mutex; void foo() {
auto this_id = std::this_thread::get_id(); g_display_mutex.lock();
cout << "thread" << this_id << " sleeping..." << endl;
g_display_mutex.unlock(); std::this_thread::sleep_for(std::chrono::seconds());
} int main(void) {
std::thread t1(foo);
std::thread t2(foo); t1.join();
t2.join(); // 输出:
// thread2 sleeping...
// thread3 sleeping... return ;
}
std::this_thread::sleep_for:
定义于头文件 <thread>
函数原型:
template< class Rep, class Period >
void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration );
阻塞当前线程执行,以至少为指定的 sleep_duration
。
此函数可能阻塞长于 sleep_duration
,因为调度或资源争议延迟。
标准库建议用稳定时钟度量时长。若实现用系统时间代替,则等待时间亦可能对始终调节敏感
异常:任何时钟、 time_point 或 duration 在执行间抛出的异常(标准库提供的时钟、时间点和时长决不抛出)
代码:
#include <iostream>
#include <chrono>
#include <thread>
using namespace std; int main(void) {
cout << "hello waiter" << endl; auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds());
auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::milli> elapsed = end - start;
cout << "waited " << elapsed.count() << " ms" << endl; // 输出:
// hello waiter
// waited 2001.44 ms return ;
}
std::this_thread::sleep_until:
定义于头文件 <thread>
template< class Clock, class Duration >
void sleep_until( const std::chrono::time_point<Clock,Duration>& sleep_time );
阻塞当前线程,直至抵达指定的 sleep_time
。
使用联倾向于 sleep_time
的时钟,这表示时钟调节有影响。从而在调用时间点后,阻塞的时长可能小于,但不会多于 sleep_time - Clock::now() 。函数亦可能阻塞长于抵达 sleep_time
之后,由于调度或资源争议延迟
代码:
#include <iostream>
#include <chrono>
#include <thread>
using namespace std; int main(void) {
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_until(start + std::chrono::seconds());
auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::milli> elapsed = end - start;
cout << "waited " << elapsed.count() << " ms" << endl; // 输出:
// waited 2001.42 ms return ;
}
最新文章
- 5 HTML&;JS等前端知识系列之jquery基础
- How to use FTP
- mysql connection refused
- Cordova webapp实战开发(20161207 )
- Quartz定时任务学习(一)简单任务
- 【Android开发坑系列】之Fragment
- Eclipse无法通过FileExplore打开真机data目录
- Java ";JSON中无分隔符日期字符串处理";
- tabindex属性
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD
- Less的嵌套规则
- [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
- ubuntu 16.04上 mysql 5.7 安装笔记
- python文件读取操作
- android 通过修改图片像素实现CircleImageView
- luogu P2331 [SCOI2005]最大子矩阵
- Winform选择目录路径与选择文件路径
- matlab画图变粗脚本
- selector的小箭头去除
- SMTP 发邮件
热门文章
- day5心得
- html-select
- uboot重定位代码分析(转)
- POJ1161(并查集)
- AngularJS学习(一)
- LINUX下用C语言历遍目录 C语言列出目录 dirent.h在C/C++中的使用
- SpringCloud02 Eureka知识点、Eureka服务端和客户端的创建、Eureka服务端集群、Eureka客户端向集群的Eureka服务端注册
- Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制
- 20-取石子动态规则(hdu2516 斐波那契博弈)
- 26.COUNT() 函数