详解C++11 线程休眠函数

C++ 11之前并未提供专门的休眠函数。c语言的sleep、usleep其实都是系统提供的函数,不同的系统函数的功能还有些差异。

在Windows系统中,sleep的参数是毫秒。

sleep(2*1000); //sleep for 2 seconds

在类Unix系统中,sleep()函数的单位是秒。

sleep(2);  //sleep for 2 seconds

从C++11开始,中C++标准库提供了专门的线程休眠函数,使得你的代码可以独立于不同的平台。

std::this_thread::sleep_for

std::this_thread::sleep_untill

1. 让线程休眠一段时间

std::this_thread::sleep_for用于Block当前线程一段时间。

template< class Rep, class Period >
void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration );

sleep的时间间隔从纳秒到小时都有具体的定义。

std::chrono::nanoseconds
std::chrono::microseconds
std::chrono::milliseconds
std::chrono::seconds
std::chrono::minutes
std::chrono::hours

比如我们想要一个线程休眠100ms。

std::this_thread::sleep_for(std::chrono::milliseconds(100));

我们想要一个线程休眠1分钟:

std::this_thread::sleep_for(std::chrono::minutes(1));

完整的代码示例:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
  std::cout << "Hello waiter\n" << std::flush;

  auto start = std::chrono::high_resolution_clock::now();

  std::this_thread::sleep_for(std::chrono::milliseconds(2000));

  auto end = std::chrono::high_resolution_clock::now();

  std::chrono::duration<double, std::milli> elapsed = end-start;
  std::cout << "Waited " << elapsed.count() << " ms\n";
}

输出:

Hello waiter
Waited 2000.12 ms

2. 休眠直至到一个时间点

template< class Clock, class Duration >
void sleep_until( const std::chrono::time_point<Clock,Duration>& sleep_time )

sleep_until会阻塞当前线程直至未来某个时间点到达。

#include <iostream>
#include <thread>
#include <chrono>

// Print Current Time
void print_time_point(std::chrono::system_clock::time_point timePoint) {
  std::time_t timeStamp = std::chrono::system_clock::to_time_t(timePoint);
  std::cout << std::ctime(&timeStamp) << std::endl;
}

void threadFunc() {
  std::cout<<"Current Time :: ";
  // Print Current Time
  print_time_point(std::chrono::system_clock::now());
  // create a time point pointing to 10 second in future
  std::chrono::system_clock::time_point timePoint =
      std::chrono::system_clock::now() + std::chrono::seconds(10);
  std::cout << "Going to Sleep Until :: "; print_time_point(timePoint);
  // Sleep Till specified time point
  // Accepts std::chrono::system_clock::time_point as argument
  std::this_thread::sleep_until(timePoint);
  std::cout<<"Current Time :: ";
  // Print Current Time
  print_time_point(std::chrono::system_clock::now());
}

int main() {
  std::thread th(&threadFunc);
  th.join();

  return 0;
}

程序输出:

Current Time :: Sun Oct 11 02:57:38 2020

Going to Sleep Until :: Sun Oct 11 02:57:48 2020

Current Time :: Sun Oct 11 02:57:48 2020

参考材料

1.https://baike.baidu.com/item/sleep%E5%87%BD%E6%95%B0/6735027

2.https://thispointer.com/how-to-put-a-thread-to-sleep-in-c11-sleep_for-sleep_until/

以上就是详解C++11 线程休眠函数的详细内容,更多关于C++11 线程休眠函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于C++实现的线程休眠代码

    本文实例讲述了基于C++实现的线程休眠代码,分享给大家供大家参考.具体方法如下: linux平台示例如下: /* File : thread1.c Author : Mike E-Mail : Mike_Zhang@live.com */ #include <stdio.h> #include <pthread.h> #include <time.h> void m_threadSleep(int sec,int nsec) { struct timespec slee

  • C++11用两个线程轮流打印整数的实现方法

    使用C++11标准的的线程语法,用两个线程轮流打印整数,一个线程打印奇数,一个线程打印偶数.可以练习线程的基本操作.线程锁和条件变量等技术.完整代码如下.代码后面附有主要语句的讲解. #include <thread> #include <iostream> #include <mutex> #include <condition_variable> std::mutex data_mutex; std::condition_variable data_va

  • 解读C++11 原生字符串

    1.基本概念与作用 原生字符串(Raw String)指不进行转义"所见即所得"的字符串.很多编程语言早已支持原生字符串,如C#.Python.Shell等.C++作为一门高级程序设计语言,自然不能自甘落后,从C++11开始,C++也开始支持原生字符串. 很多时候,当我们需要一行字符串的时候,字符串转义往往成了一个负担,写和读都带了很大的不便.例如,对于如下路径"D:\workdataDJ\code\vas_pgg_proj",我们必须通过反斜杠进行转义,把它写成如

  • C++11智能指针之weak_ptr详解

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以看看另一篇文章: [C++11新特性] C++11智能指针之shared_ptr 1.为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识. 我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对

  • c++11新特性多线程操作实战

    c++11多线程操作 线程 thread int main() { thread t1(Test1); t1.join(); thread t2(Test2); t2.join(); thread t3 = t1; thread t4(t1); thread t5 = std::move(t1); thread t6(std::move(t1)); return 0; } t3,t4创建失败,因为thread的拷贝构造和赋值运算符重载的原型是: thread(const thread&) = d

  • C++11 Unicode编码转换

    1.char16_t与char32_t 在C++98中,为了支持Unicode字符,使用wchar_t类型来表示"宽字符",但并没有严格规定位宽,而是让wchar_t的宽度由编译器实现,因此不同的编译器有着不同的实现方式,GNU C++规定wchar_t为32位,Visual C++规定为16位.由于wchar_t宽度没有一个统规定,导致使用wchar_t的代码在不同平台间移植时,可能出现问题.这一状况在C++11中得到了一定的改善,从此Unicode字符的存储有了统一类型: (1)c

  • C++11新特性std::make_tuple的使用

    std::tuple是C++ 11中引入的一个非常有用的结构,以前我们要返回一个包含不同数据类型的返回值,一般都需要自定义一个结构体或者通过函数的参数来返回,现在std::tuple就可以帮我们搞定. 1.引用头文件 #include <tuple> 2. Tuple初始化 std::tuple的初始化可以通过构造函数实现. // Creating and Initializing a tuple std::tuple<int, double, std::string> resul

  • C++11智能指针中的 unique_ptr实例详解

    在前面一篇文章中,我们了解了 C++11 中引入的智能指针之一 shared_ptr 和 weak_ptr ,今天,我们来介绍一下另一种智能指针 unique_ptr . 往期文章参考: [C++11新特性] C++11 智能指针之shared_ptr [C++11新特性] C++11智能指针之weak_ptr unique_ptr介绍 unique是独特的.唯一的意思,故名思议,unique_ptr可以"独占"地拥有它所指向的对象,它提供一种严格意义上的所有权. 这一点和我们前面介绍

  • 详解C++之C++11的牛逼特性

    一.列表初始化 1.1 C++98中,标准允许使用花括号{}对数组元素进行统一的列表初始值设定. int array1[] = {1,2,3,4,5}; int array2[] = {0}; 对对于一些自定义类型,却不行. vector<int> v{1,2,3,4,5}; 在C++98中这样无法通过编译,因此需要定义vector之后,在使用循环进行初始赋值. C++11扩大了用初始化列表的使用范围,让其适用于所有的内置类型和自定义类型,而且使用时,=可以不写 // 内置类型 int x1

  • C++11新特性std::tuple的使用方法

    1. 引入头文件 #include <tuple> 2. std::tuple初始化 std::tuple<int, std::string, float> t1(10, "Test", 3.14); 这里要注意,不是所有的C++ 11编译器都支持copy-list-initialization的方式.如下代码所示. std::tuple<int, int> foo_tuple() { return {1, -1}; // Error until N

  • 详解C++11强类型枚举

    1.传统枚举类型的缺陷 枚举类型是C/C++中用户自定义的构造类型,它是由用户定义的若干枚举常量的集合.枚举值对应整型数值,默认从0开始.比如定义一个描述性别的枚举类型. enum Gender{Male,Female}; 其中枚举值Male被编译器默认赋值为0,Female赋值为1.传统枚举类型在设计上会存在以下几个问题. (1)同作用域同名枚举值会报重定义错误.传统C++中枚举常量被暴漏在同一层作用域中,如果同一作用域下有两个不同的枚举类型,但含有同名的枚举常量也是会报编译错误的,比如: e

随机推荐