C\C++ Thread-多线程

文章作者:里海
来源网站:https://blog.csdn.net/WangPaiFeiXingYuan


目录

简介

时间

c语言的时间处理:time.h

c++11语言的时间处理:引入时间标准库std::chrono

时间段Duration:

进程与线程


简介

c++11多线程编程,下图是本文的大纲。

时间

在开始多线程之前首先要理解什么是时间

c语言的时间处理:time.h

获取从1970年1月1日到当前经过的秒数:

long t0 = time(NULL);

让程序暂停3秒:

sleep(3);

当前时间的3秒后:

long t1 = t0 + 3;

        可见c语言没有时间类型的区分,容易导致单位错误和混淆时间点和时间段。再比如t0*3,乘法对时间点而言是无意义的,但是c语言将他看作是long类型,允许时间点的乘法,容易让程序员犯错。

        c++从第11个版本就将时间标准化了,c++11引入了时间标准库。

c++11语言的时间处理:引入时间标准库std::chrono

        chrono库明确区分时间点和时间段,明确区分不同的时间单位。chrono库主要包含了三种类型:时间间隔Duration、时钟Clocks和时间点Time point。

时间段Duration:

duration的原型是:

template<class Rep, class Period = std::ratio<1>> class duration;

        第一个模板参数Rep是一个数值类型,表示时钟个数;

        第二个模板参数是一个默认模板参数std::ratio<1>,它的原型是:

template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio;

        它表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,ratio代表的是一个分子除以分母的分数值,比如ratio<2>代表一个时钟周期是两秒,ratio<60>代表了一分钟,ratio<60*60>代表一个小时,ratio<60*60*24>代表一天。而ratio<1, 1000>代表的则是1/1000秒即一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。标准库为了方便使用,就定义了一些常用的时间间隔,如时、分、秒、毫秒、微秒和纳秒,在chrono命名空间下,它们的定义如下:

typedef ratio<1, 1000000000> nano;    //纳秒
typedef ratio<1, 1000000> micro;      //微秒
typedef ratio<1, 1000> milli;         //毫秒

typedef duration<int, ratio<3600> > hours; //时
typedef duration<int, ratio<60> > minutes; //分
typedef duration<long long> seconds; //秒
typedef duration<long long, milli> milliseconds; //毫秒
typedef duration<long long, micro> microseconds; //微秒
typedef duration<long long, nano> nanoseconds; //纳秒

        通过定义这些常用的时间间隔类型,我们能方便的使用它们。该库方便了时间的运算符重载,如时间点加上时间段等于新的时间点,时间点减去另一个时间点等于时间段。比如线程的休眠:

std::this_thread::sleep_for(std::chrono::seconds(3)); //休眠三秒
std::this_thread::sleep_for(std::chrono:: milliseconds (100)); //休眠100毫秒

auto oneDay = std::chrono::duration<int, std::ratio<24*60*60>>(1);
std::this_thread::sleep_for(oneDay); //休眠一天

        可以使用chrono::steady_clock::now()获取当前时间点,使用时间点加上时间段可以得到新的时间点,使用两个时间点相减可以得到时间段,然后可以使用duration_cast将时间段转换为不同的时间单位,如转换为秒数。整体来看,std::chrono库提供了方便、易用的时间处理功能,下面是例子。

时间点是指一个具体的时间,如2023年6月13日20点48分10秒;时间段是指时间的长度,如1分30秒。在该库中,时间点类型为chrono::steady_clock::time_point等。

获取当前时间点

 auto t0 = std::chrono::steady_clock::now();

当前时间点的30秒后

 auto t1 = t0 + std::chrono::seconds(30);

获取两个时间点的差(时间段)

auto dt = t1 - t0;

获取时间差的秒数

int64_t sec = std::chrono::duration_cast<std::chrono::seconds>(dt).count();

计算程序运行花费的时间,例如下面计算第7行程序运行的时间微秒数

 使用double类型,提高精度,返回带小数点的微秒数

std::this_thread::sleep_for可跨平台,可以指定单位,例如:暂停400微妙

进程与线程

猜你喜欢

转载自blog.csdn.net/WangPaiFeiXingYuan/article/details/131195703