整理自:zh.cppreference.com/w/cpp/thread

std::this_thread::yield:

定义于头文件 <thread>

函数原型:void yield() noexcept;

此函数的准确性为依赖于实现,特别是使用中的 OS 调度器机制和系统状态。例如,先进先出实时调度器( Linux 的 SCHED_FIFO )将悬挂当前线程并将它放到准备运行的同优先级线程的队列尾(而若无其他线程在同优先级,则 yield 无效果)

代码:

  1. #include <iostream>
  2. #include <thread>
  3. #include <chrono>
  4. using namespace std;
  5.  
  6. void little_sleep(std::chrono::milliseconds us) {
  7. auto start = std::chrono::high_resolution_clock::now();
  8. auto end = start + us;
  9. do {
  10. std::this_thread::yield();//让出当前时间片
  11. }while(std::chrono::high_resolution_clock::now() < end);
  12. }
  13.  
  14. int main(void) {
  15. auto start = std::chrono::high_resolution_clock::now();//获取当前时间
  16.  
  17. little_sleep(std::chrono::milliseconds());
  18.  
  19. auto elapsed = std::chrono::high_resolution_clock::now() - start;//计算执行 little_sleep 所用时间
  20.  
  21. cout << "waited fo "
  22. << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() //将 elapsed 时间周期转化为 milliseconds 并输出
  23. << " milliseconds\n";
  24.  
  25. // 输出:
  26. // waited fo 100 milliseconds
  27.  
  28. return ;
  29. }

std::this_thread::get_id:

定义于头文件 <thread>

函数原型:std::thread::id get_id() noexcept;

得到当前线程的 id

代码:

  1. #include <iostream>
  2. #include <thread>
  3. #include <chrono>
  4. #include <mutex>
  5. using namespace std;
  6.  
  7. std::mutex g_display_mutex;
  8.  
  9. void foo() {
  10. auto this_id = std::this_thread::get_id();
  11.  
  12. g_display_mutex.lock();
  13. cout << "thread" << this_id << " sleeping..." << endl;
  14. g_display_mutex.unlock();
  15.  
  16. std::this_thread::sleep_for(std::chrono::seconds());
  17. }
  18.  
  19. int main(void) {
  20. std::thread t1(foo);
  21. std::thread t2(foo);
  22.  
  23. t1.join();
  24. t2.join();
  25.  
  26. // 输出:
  27. // thread2 sleeping...
  28. // thread3 sleeping...
  29.  
  30. return ;
  31. }

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 在执行间抛出的异常(标准库提供的时钟、时间点和时长决不抛出)

代码:

  1. #include <iostream>
  2. #include <chrono>
  3. #include <thread>
  4. using namespace std;
  5.  
  6. int main(void) {
  7. cout << "hello waiter" << endl;
  8.  
  9. auto start = std::chrono::high_resolution_clock::now();
  10. std::this_thread::sleep_for(std::chrono::seconds());
  11. auto end = std::chrono::high_resolution_clock::now();
  12.  
  13. std::chrono::duration<double, std::milli> elapsed = end - start;
  14. cout << "waited " << elapsed.count() << " ms" << endl;
  15.  
  16. // 输出:
  17. // hello waiter
  18. // waited 2001.44 ms
  19.  
  20. return ;
  21. }

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 之后,由于调度或资源争议延迟

代码:

  1. #include <iostream>
  2. #include <chrono>
  3. #include <thread>
  4. using namespace std;
  5.  
  6. int main(void) {
  7. auto start = std::chrono::high_resolution_clock::now();
  8. std::this_thread::sleep_until(start + std::chrono::seconds());
  9. auto end = std::chrono::high_resolution_clock::now();
  10.  
  11. std::chrono::duration<double, std::milli> elapsed = end - start;
  12. cout << "waited " << elapsed.count() << " ms" << endl;
  13.  
  14. // 输出:
  15. // waited 2001.42 ms
  16.  
  17. return ;
  18. }

c++多线程基础2(命名空间 this_thread)的更多相关文章

  1. C++多线程基础教程

    目录 1 什么是C++多线程? 2 C++多线程基础知识 2.1 创建线程 2.2 互斥量使用 lock()与unlock(): lock_guard(): unique_lock: conditio ...

  2. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

  3. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  4. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  5. JAVASE02-Unit09: 多线程基础

    Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 *  * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ...

  6. java多线程基础

    多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...

  7. C#编程总结(二)多线程基础

    C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...

  8. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  9. Java多线程干货系列(1):Java多线程基础

    原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...

随机推荐

  1. Python多线程-守护线程

    守护线程:守护着非守护线程,守护线程和非守护线程同时运行,当非守护线程运行结束后,无论守护线程有没有运行完,脚本都会停止运行 首先看一段普通的多线程实例 # -*- coding:utf-8 -*- ...

  2. Django Rest Framework 4

    目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...

  3. 「小程序JAVA实战」 小程序抽离公用方法进行模块化(12)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-12/ 小程序的模块化,把砖磊成一个墩子,用的时候把整个墩子移走.js更好的调用,应用更加公用化.源 ...

  4. java socket发送xml报文

    ServerRun.java import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; pub ...

  5. spring集成Redis(单机、集群)

    一.单机redis配置 1. 配置redis连接池 <bean id="jedisPoolConfig" class="redis.clients.jedis.Je ...

  6. Collision Detection

    [Collision Detection] Collision Detection是Rigidbody中的一个属性.所以显然Collision Detection指定的类型只在Rigidbody之间才 ...

  7. elasticsearch2.x插件之一:kopf

    kopf kopf is a simple web administration tool for elasticsearch written in JavaScript + AngularJS + ...

  8. Professional C# 6 and .NET Core 1.0 - Creating Hello, World! with Visual Studio

    本文为转载,学习研究 Creating Hello, World! with Visual Studio Chapter 1, “.NET Application Architectures,” ex ...

  9. Mongodb的安装与启动

    下载链接: http://www.mongodb.org/downloads ------------------------------------------------------------- ...

  10. Centos7.2 下搭建LNMP环境(终极版)Yum安装

    PHP7.1+Nginx+MySQL5.7 安装PHP //安装源只要遇到选择的全是Y rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-rele ...