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 ;
}
c++多线程基础2(命名空间 this_thread)的更多相关文章
- C++多线程基础教程
目录 1 什么是C++多线程? 2 C++多线程基础知识 2.1 创建线程 2.2 互斥量使用 lock()与unlock(): lock_guard(): unique_lock: conditio ...
- Java基础知识笔记(四:多线程基础及生命周期)
一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- JAVASE02-Unit010: 多线程基础 、 TCP通信
多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...
- JAVASE02-Unit09: 多线程基础
Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 * * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ...
- java多线程基础
多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...
- C#编程总结(二)多线程基础
C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- Java多线程干货系列(1):Java多线程基础
原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...
随机推荐
- Dev控件类似于ComBox的DropDownControl用法
dropDownButton1.DropDownControl= CreateDXPopupMenu(); private DXPopupMenu CreateDXPopupMenu() { DXPo ...
- 第十五章 MySQL日志(待续)
·······
- 14-jQuery的ajax
什么是ajax AJAX = 异步的JavaScript 和 XML (Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据 ...
- MySQL的FORMAT函数用法规则
1.FORMAT函数在mysql中是数据内容格式化的,格式化后得到结果:###,###,#####. ,); 输出结果: ,000.00 2.可以格式化数据为整数或者浮点数. ); 输出结果: 100 ...
- latex 显示中文
中文支持需要cjk-latex,总得来说中文可以使用GB和GBK两种字体,GBK需要从windows下copy *.ttc或*.ttf, GB字体则在linux下就用. 先说支持GB的中文显示,安装以 ...
- CSS鼠标手势大全
实例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- java Web中页面跳转方式之请求转发
1.在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在Servlet01中setAttribute()保存数据在Servlet02中由getAt ...
- 4-1 线程安全性-原子性-atomic-1
我们发现在不做任何同步的情况下,我们计算的累加结果是错误的. com.mmall.concurrency.example.count.CountExample2 C:\Users\ZHONGZHENH ...
- 【总结整理】微信产品-张小龙-PM学习总结
伟大的产品可以满足人类的情感需求.找到需求背后的心理诉求产品的终极目标是满足任性需求,不在产品中掺杂自己的道德感.“我有个好主意”,往往都是脱离用户需求的. 1,不直接满足用户需求2,用户需求是零散的 ...
- 张超超OC基础回顾04_实例变量修饰(@public),点语法,self关键字,多态,继承
零.实例变量修饰符 /* @public 就是实例变量修饰符 @public >可以在其它类中访问被public修饰的成员变量 >也可以在本类中访问被public修饰的成员变量 >可 ...