为了方便使用,在标准库中定义了一些常用的时间间隔,比如:时、分、秒、毫秒、微秒、纳秒,它们都位于 chrono 命名空间下,定义如下: 类型 定义 纳秒:std::chrono::nanoseconds...durationRep/ 至少 64 位的有符号整数类型 /, std::nano> 微秒:std::chrono::microseconds durationRep/ 至少 55 位的有符号整数类型...::seconds durationRep/ 至少 35 位的有符号整数类型 /> 分钟:std::chrono::minutes durationRep/ 至少 29 位的有符号整数类型 /, std...在这些时钟类的内部有 time_point、duration、Rep、Period 等信息,基于这些信息来获取当前时间,以及实现 time_t 和 time_point 之间的相互转换。...函数的作用是对时间点进行转换,因为不同的时间点对象内部的时钟周期 Period,和周期次数的类型 Rep 可能也是不同的,一般情况下它们之间可以进行隐式类型转换,也可以通过该函数显示的进行转换,函数原型如下
在平时编程中我们往往有需要计算时间等相关需求,本节我们详细介绍下C++标准中时间相关的chrono库。...0; } 持续时间(Durations):持续时间表示两个时间点之间的时间段。...示例: #include chrono> #include int main() { // 创建一个持续时间为1小时的时间段 auto duration_hours...std::chrono::minutes>(duration_hours); // 打印转换后的持续时间 std::cout Duration in minutes: " <...::nanoseconds; // 持续时间类型 using rep = duration::rep; // 表示时间的基本类型 using period = duration::period
时钟与时间点 chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。...:高精度时钟(当前系统能提供的最高精度时钟,很可能就是steady_clock),也是单调的; 需要得到绝对时点的场景使用system_clock;需要得到时间间隔,且不受系统时间修改而受影响时使用...::nano::den; //返回运行的秒数,如1.00345 } } 时间间隔duration chrono中使用duration模板类来表示时间间隔,并定义了从小时到纳秒的时间间隔。...nMillSec){ std::chrono::seconds secs(nSec); std::chrono::milliseconds mills(nMillSec); std::this_thread...::sleep_for(secs+mills); } duration_cast 使用duration_cast可以方便的在不同时间单位间进行转换,如: auto sec=seconds(123); auto
原子从某高能阶跃迁到某低能阶时,会释放频率非常稳定的电磁波,例如 铯-133 原子在基态的两个超精细能级之间跃迁时,会释放频率为 9192631770 Hz 的电磁波,即该电磁波 1 秒中有 9192631770...4. std::chrono #include chrono> std::ratio 在 chrono 库中表示秒、分、时等单位 std::nano 即 std::ratio,在 chrono 中表示纳秒单位 std::micro 即 std::ratio,在 chrono 中表示微秒单位 std::milli 即 std::ratio,在 chrono 中表示毫秒单位 模板二参默认是1,ratio 即 ratio,在 chrono 中表示1分钟 chrono::days (C++20) 相当于 duration...不同的 Clock 即不同的 epoch。 time_point::duration:指定计时的单位(period)和类型(rep),一般是 秒(ratio) 和 integer(long)。
首先看一下使用chrono简单计时的示例代码: void func() { // 计时 std::chrono::time_pointstd::chrono::high_resolution_clock...标准库还提供了duration_cast用于转换各种duration。...::chrono::seconds(10); auto mill = std::chrono::duration_caststd::chrono::milliseconds>(sec);...: void func() { std::chrono::time_pointstd::chrono::system_clock, std::chrono::milliseconds> tp(...在C89的范围是[0-61],在C99更正为[0-60]。
,多线程一般代表系统核数 static unsigned int hardware_concurrency() noexcept; std::mutex 互斥锁,主要用来线程同步,保证在同一时间内只有一个线程对某一资源进行读写操作...template Rep, class _Period> bool try_lock_for(const chrono::durationRep, _Period>& __rtime..._Duration> bool try_lock_until(const chrono::time_pointDuration>& __atime) { return _M_try_lock_until...template Rep, class _Period> bool try_lock_for(const chrono::durationRep, _Period>& __rtime...& __lock, const chrono::durationRep, _Period>& __rtime, _Predicate __p){ return wait_until
std::chrono命名空间是C++标准库的一部分,因此它具有跨平台的兼容性,并且在不同的操作系统中都能正常工作。...比如:std::chrono::durationstd::duratio>表示毫秒级别的时间段。在使用Duration时,可以进行加减、比较和表示等操作。...最后,我们计算了当前时间点和未来时间点之间的时间间隔,并输出结果。注意:在计算时间间隔时,使用了duration_cast将时间间隔转换为所需的duration类型(在这里是double类型)。...五、clock的使用详解5.1、不同类型的clock在std::chrono库中,存在三种不同类型的时钟:system_clock、steady_clock和high_resolution_clock。...注意:不同的平台可能对这些时钟的实现有所不同,最小时间单位也可能有所不同。可以使用duration_cast将时间间隔转换为所需的时间单位(例如秒、毫秒、纳秒等)。
主要有以下优势: 无需考虑互斥量的初始化和销毁,在类的构造和析构函数中管理,无需使用者操心。 采用RAII对互斥量进行了不同封装,提供了更方便的上锁机制。...unique_lock提供lock与unlock,同时析构时也会释放锁。 std::unique_lock 可以在构造时传递第二个参数用于管理互斥量,且能传递不同域中互斥量所有权。..., class _Period> unique_lock(_Mutex& _Mtx, const chrono::durationRep, _Period>& _Rel_time)...unique_lock(_Mutex& _Mtx, const chrono::durationRep, _Period>& _Rel_time) 在指定时间长内尝试获取传递的mutex的锁返回。...unique_lock(mutex_type& m,std::chrono::time_pointDuration> const& absolute_time) 在给定时间点尝试获取传递的
,override用于修饰派生类中的成员函数,标明该函数重写了基类函数,如果一个函数声明了override但父类却没有这个虚函数,编译报错,使用override关键字可以避免开发者在重写基类函数时无意产生的错误...time_point clocks duration std::chrono::duration表示一段时间,常见的单位有s、ms等,示例代码: // 拿休眠一段时间举例,这里表示休眠100ms std...: 1 template Rep, class Period = ratio > class duration; Rep表示一种数值类型,用来表示Period的数量,比如int、float...、double,Period是ratio类型,用来表示【用秒表示的时间单位】比如second,常用的durationRep, Period>已经定义好了,在std::chrono::duration下...::array:数组,在越界访问时抛出异常,建议使用std::array替代普通的数组 std::tuple:元组类型,类似pair,但比pair扩展性好 typedef std::tuple<int,
std::thread 在 头文件中声明,因此使用 std::thread 需包含 头文件。...另外命名空间 std::this_thread 也声明在 头文件中。...Rep, class Period> void sleep_for(const chrono::durationRep, Period>& rel_time); }...templateDuration > void sleep_until( const std::chrono::time_pointDuration...templateRep, class Period > void sleep_for( const std::chrono::durationRep,Period>& sleep_duration
wait_for (const chrono::durationRep,Period>& rel_time) const; 而与 std::future::wait() 不同的是,wait_for...Duration>& abs_time) const; 而与 std::future::wait() 不同的是,wait_until() 可以设置一个系统绝对时间点 abs_time,如果共享状态的标志在该时间点到来之前没有被...Provider 设置为 ready,则调用 wait_until 的线程被阻塞,在 abs_time 这一时刻到来之后 wait_until() 返回,返回值如下: 返回值 描述 future_status...shared_future 可以通过某个 std::future 对象隐式转换(参见 std::shared_future 的构造函数),或者通过 std::future::share() 显示转换,无论哪种转换...wait_until(): 等待与该 std::shared_future 对象相关联的共享状态的标志变为 ready。(在某一时刻前等待,超过该时刻 wait_until 返回。)
而且在收到其它线程的通知后仅仅有当 pred 为 true 时才会被解除堵塞,解决了虚假唤醒的问题。...:chrono::durationRep, Period>& rel_time); template Rep, class Period, class Predicate> bool...wait_for (unique_lock& lck, const chrono::durationRep,Period>& rel_time, Predicate pred); wait_for...& lock, const std::chrono::time_pointDuration>& abs_time); template Duration...小心使用 std::condition_variable_any std::condition_variable_any 是通用的条件变量,可以与不同类型的互斥量一起使用。
示例: #include chrono> #include #include #include // std::cout std::chrono...try_lock_for的函数原型如下: //timeout_duration为要阻塞的最大时长 templateRep, class Period > bool try_lock_for...( const std::chrono::durationRep, Period>& timeout_duration ); //C++1 当前线程会在锁定成功(占有互斥量)或者经过指定的时长 timeout_duration...( const std::chrono::time_pointDuration>& timeout_time ); //C++11 起 当前线程会在锁定成功(占有互斥量)或者抵达指定的时间点...当前线程会在锁定成功(占有互斥量)或者经过指定的时长 timeout_duration(超时)前阻塞,取决于何者先到来。锁定成功时返回 true,否则返回 false。
{std::unique\_ptr}std::unique_ptr unique_ptr\text{unique\_ptr}unique_ptr 独占所指向的对象,同一时刻只能有一个 unique_ptr...std::chrono::durationstd::ratio> microseconds = 30; // 30ms std::chrono::duration\text...{std::chrono::duration}std::chrono::duration 还提供了不同 duration\text{duration}duration 之间的转换函数——duration_cast...std::chrono::duration_cast(seconds); // 将 1s 转换为小时单位 time_point\text{time\_point}time_point...{time\_point\_cast}time_point_cast,用来转换不同时间。
在第二种情况下(即设置了 Predicate),只有当 pred 条件为 false 时调用 wait() 才会阻塞当前线程,并且在收到其他线程的通知后只有当 pred 为 true 时才会被解除阻塞。...::durationRep,Period>& rel_time); predicate (2) template Rep, class Period, class Predicate>bool...wait_for (unique_lock& lck, const chrono::durationRep, Period>& rel_time, Predicate...pred 为 true 时才会被解除阻塞,因此相当于如下代码: return wait_until (lck, chrono::steady_clock::now() + rel_time, std:...,并且在收到其他线程的通知后只有当 pred 为 true 时才会被解除阻塞,因此相当于如下代码: while (!
其中,在将Ptime转为Time_T的过程中,需要使用boost库提供的时间函数,并结合计算时间差的方法将Ptime时间对象转换为对应的Time_T值。...通过本节内容的学习,读者可掌握如何使用boost库进行Ptime与Time_T之间的相互转换,并在实际开发中运用相关技巧和方法解决时间处理问题,提升代码编程能力以及开发效率。...使用boost库中的日期格式化函数,我们可以方便地将日期对象转换为不同的字符串格式,以满足具体应用的需求。...具体而言,我们介绍了如何计算时间点之间的时间差,如何将时间持续类型转换成其他类型,以及如何计算两个时间区间之间的时间差等等。...; cout 之间类型转换 boost::chrono::seconds cast_minutes(300); boost
其中,在将Ptime转为Time_T的过程中,需要使用boost库提供的时间函数,并结合计算时间差的方法将Ptime时间对象转换为对应的Time_T值。...通过本节内容的学习,读者可掌握如何使用boost库进行Ptime与Time_T之间的相互转换,并在实际开发中运用相关技巧和方法解决时间处理问题,提升代码编程能力以及开发效率。...使用boost库中的日期格式化函数,我们可以方便地将日期对象转换为不同的字符串格式,以满足具体应用的需求。...具体而言,我们介绍了如何计算时间点之间的时间差,如何将时间持续类型转换成其他类型,以及如何计算两个时间区间之间的时间差等等。...; cout << "1900秒加5分钟: " << m << endl; // 时间之间类型转换 boost::chrono::seconds cast_minutes(300);
toc在C++17中,std::chrono库提供了一组强大的时间处理工具,包括std::chrono::duration和std::chrono::time_point。...1. std::chrono::duration的舍入函数std::chrono::duration是一个模板类,用于表示时间间隔。...在C++17中,std::chrono提供了floor、ceil和round三个舍入函数,用于将duration值转换为指定精度的近似值。...1.1 floorfloor函数将duration值向下舍入到指定的精度。例如,将秒级时间间隔舍入到毫秒级时,floor会丢弃小于毫秒的部分。...3.3 时间同步在分布式系统中,时间点的舍入可以用于同步不同节点的时间,确保它们在相同的精度级别上操作。4.
在C++多线程中会经常用到mutex,在使用的时候lock后,有时候会忘记使用unlock进行解锁造成死锁,或者在lock和unlock之间代码异常跳出,导致程序无法执行到unlock造成死锁,因此在C...// 阻塞到经过指定的 timeout_duration 或获得锁这两个事件的先到来者为止 templateRep, class Period > unique_lock( mutex_type...& m, const std::chrono::durationRep,Period>& timeout_duration ); //C++11 起 // 构造以 m 为关联互斥的...& m, const std::chrono::time_pointDuration>& timeout_time ); //C++11 起 类 unique_lock...counter: 16 1, final counter: 17 7, final counter: 18 9, final counter: 19 8, final counter: 20 4.两者之间的不同
在std::lock_guard对象构造时,传入的mutex对象(即它所管理的mutex对象)会被当前线程锁住。...在lock_guard对象被析构时,它所管理的mutex对象会自动解锁,不需要程序员手动调用lock和unlock对mutex进行上锁和解锁操作。...和promise的作用是在不同线程之间传递数据。...std::launch::deferred:延迟加载方式创建线程。调用async时不创建线程,直到调用了future的get或者wait时才创建线程。...Rep, class Period > std::future_status wait_for( const std::chrono::durationRep,Period>& timeout_duration
领取专属 10元无门槛券
手把手带您无忧上云