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 线程 ...
随机推荐
- 实验吧CTF题库-隐写术(部分)
Spamcarver 用kali下载图片 root@sch01ar:~# wget http://ctf5.shiyanbar.com/stega/spamcarver/spamcarver.jpg ...
- oracle 查询中实现分页
那么Oracle如何实现分页呢?--Oracle分页查询SELECT * FROM ( SELECT ROWNUM R,YANGCQ_ID,YANGCQ_BRANCHI ...
- flask ---映射到数据库
在当前项目文件下:运行cmd指令(terminal中) (1)python manage.py db init ----初始化文件 (2)python manage.py db migrate-- ...
- CBV中的dispatch
之前介绍了FBV和CBV ,下面我们看一下CBV中的dispatch dispatch函数在类View中定义,作用就是通过反射查找get或post函数,所以在执行get或post函数之前,dispat ...
- .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》
在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...
- struts2结合axis开发webservice
第一步:引入axis的依赖jar包 第二步:修改web.xml文件 <listener> <listener-class>org.apache.axis.transport ...
- java Web 过滤器Filter详解
简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...
- java基础之JDBC八:Druid连接池的使用
基本使用代码: /** * Druid连接池及简单工具类的使用 */ public class Test{ public static void main(String[] args) { Conne ...
- selector在color和drawable目录下的区别
selector作为drawable资源时,放于drawable目录下,并且item指定android:drawable属性,引用使用@drawable而不是@color selector作为colo ...
- 图解KMP算法