求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   模型库  
会员   
 


DeepSeek大模型应用开发实践
6月12-13日 厦门



基于 UML 和EA进行分析设计
6月23-24日 北京+线上



人工智能、机器学习& TensorFlow+Keras
6月22-23日 北京
 
追随技术信仰

随时听讲座
每天看新闻
 
 
C++并发编程(中文版)
前言
第1章 你好,C++的并发世界!
1.1 何谓并发
1.2 为什么使用并发?
1.3 C++中的并发和多线程
1.4 开始入门
1.5 本章总结
第2章 线程管理
2.1 线程管理的基础
2.2 向线程函数传递参数
2.3 转移线程所有权
2.4 运行时决定线程数量
2.5 识别线程
2.6 本章总结
第3章 线程间共享数据
3.1 共享数据带来的问题
3.2 使用互斥量保护共享数据
3.3 保护共享数据的替代设施
3.4 本章总结
第4章 同步并发操作
4.1 等待一个事件或其他条件
4.2 使用期望等待一次性事件
4.3 限定等待时间
4.4 使用同步操作简化代码
4.5 本章总结
第5章 C++内存模型和原子类型操作
5.1 内存模型基础
5.2 C++中的原子操作和原子类型
5.3 同步操作和强制排序
5.4 本章总结
第6章 基于锁的并发数据结构设计
6.1 为并发设计的意义何在?
6.2 基于锁的并发数据结构
6.3 基于锁设计更加复杂的数据结构
6.4 本章总结
第7章 无锁并发数据结构设计
7.1 定义和意义
7.2 无锁数据结构的例子
7.3 对于设计无锁数据结构的指导建议
7.4 本章总结
第8章 并发代码设计
8.1 线程间划分工作的技术
8.2 影响并发代码性能的因素
8.3 为多线程性能设计数据结构
8.4 设计并发代码的注意事项
8.5 在实践中设计并发代码
8.6 本章总结
第9章 高级线程管理
9.1 线程池
9.2 中断线程
9.3 本章总结
第10章 多线程程序的测试和调试
10.1 与并发相关的错误类型
10.2 定位并发错误的技术
10.3 本章总结
附录A C++11语言特性简明参考(部分)
A .1 右值引用
A .2 删除函数
A .3 默认函数
A .4 常量表达式函数
A .5 Lambda函数
A .6 变参模板
A .7 自动推导变量类型
A .8 线程本地变量
A .9 本章总结
附录B 并发库的简单比较
附录C 消息传递框架与完整的ATM示例
 附录D C++线程库参考
D .1 chrono头文件
D .2 <condition_variable>头文件
D .3 <atomic>头文件
D .4 future头文件
D .5 <mutex>头文件
D .6 <ratio>头文件
D .7 <thread>头文件
 

 
目录
<ratio>头文件
作者:Anthony Williams  译者:陈晓伟
146 次浏览
9次  

D.6 <ratio>头文件

<ratio>头文件提供在编译时进行的计算。

头文件内容

  1. namespace std
  2. {
  3. template<intmax_t N,intmax_t D=1>
  4. class ratio;
  5. // ratio arithmetic
  6. template <class R1, class R2>
  7. using ratio_add = see description;
  8. template <class R1, class R2>
  9. using ratio_subtract = see description;
  10. template <class R1, class R2>
  11. using ratio_multiply = see description;
  12. template <class R1, class R2>
  13. using ratio_divide = see description;
  14. // ratio comparison
  15. template <class R1, class R2>
  16. struct ratio_equal;
  17. template <class R1, class R2>
  18. struct ratio_not_equal;
  19. template <class R1, class R2>
  20. struct ratio_less;
  21. template <class R1, class R2>
  22. struct ratio_less_equal;
  23. template <class R1, class R2>
  24. struct ratio_greater;
  25. template <class R1, class R2>
  26. struct ratio_greater_equal;
  27. typedef ratio<1, 1000000000000000000> atto;
  28. typedef ratio<1, 1000000000000000> femto;
  29. typedef ratio<1, 1000000000000> pico;
  30. typedef ratio<1, 1000000000> nano;
  31. typedef ratio<1, 1000000> micro;
  32. typedef ratio<1, 1000> milli;
  33. typedef ratio<1, 100> centi;
  34. typedef ratio<1, 10> deci;
  35. typedef ratio<10, 1> deca;
  36. typedef ratio<100, 1> hecto;
  37. typedef ratio<1000, 1> kilo;
  38. typedef ratio<1000000, 1> mega;
  39. typedef ratio<1000000000, 1> giga;
  40. typedef ratio<1000000000000, 1> tera;
  41. typedef ratio<1000000000000000, 1> peta;
  42. typedef ratio<1000000000000000000, 1> exa;
  43. }

 

D.6.1 std::ratio类型模板

std::ratio类型模板提供了一种对在编译时进行计算的机制,通过调用合理的数,例如:半(std::ratio<1,2>),2/3(std::ratio<2, 3>)或15/43(std::ratio<15, 43>)。其使用在C++标准库内部,用于初始化std::chrono::duration类型模板。

类型定义

  1. template <intmax_t N, intmax_t D = 1>
  2. class ratio
  3. {
  4. public:
  5. typedef ratio<num, den> type;
  6. static constexpr intmax_t num= see below;
  7. static constexpr intmax_t den= see below;
  8. };

要求

D不能为0。

描述

num和den分别为分子和分母,构造分数N/D。den总是正数。当N和D的符号相同,那么num为正数;否则num为负数。

例子

  1. ratio<4,6>::num == 2
  2. ratio<4,6>::den == 3
  3. ratio<4,-6>::num == -2
  4. ratio<4,-6>::den == 3

D.6.2 std::ratio_add模板别名

std::ratio_add模板别名提供了两个std::ratio在编译时相加的机制(使用有理计算)。

定义

  1. template <class R1, class R2>
  2. using ratio_add = std::ratio<see below>;

先决条件

R1和R2必须使用std::ratio进行初始化。

效果

ratio_add被定义为一个别名,如果两数可以计算,且无溢出,该类型可以表示两个std::ratio对象R1和R2的和。如果计算出来的结果溢出了,那么程序里面就有问题了。在算术溢出的情况下,std::ratio_add<R1, R2>应该应该与std::ratio<R1::num * R2::den + R2::num * R1::den, R1::den * R2::den>相同。

例子

  1. std::ratio_add<std::ratio<1,3>, std::ratio<2,5> >::num == 11
  2. std::ratio_add<std::ratio<1,3>, std::ratio<2,5> >::den == 15
  3. std::ratio_add<std::ratio<1,3>, std::ratio<7,6> >::num == 3
  4. std::ratio_add<std::ratio<1,3>, std::ratio<7,6> >::den == 2

D.6.3 std::ratio_subtract模板别名

std::ratio_subtract模板别名提供两个std::ratio数在编译时进行相减(使用有理计算)。

定义

  1. template <class R1, class R2>
  2. using ratio_subtract = std::ratio<see below>;

先决条件

R1和R2必须使用std::ratio进行初始化。

效果

ratio_add被定义为一个别名,如果两数可以计算,且无溢出,该类型可以表示两个std::ratio对象R1和R2的和。如果计算出来的结果溢出了,那么程序里面就有问题了。在算术溢出的情况下,std::ratio_subtract<R1, R2>应该应该与std::ratio<R1::num * R2::den - R2::num * R1::den, R1::den * R2::den>相同。

例子

  1. std::ratio_subtract<std::ratio<1,3>, std::ratio<1,5> >::num == 2
  2. std::ratio_subtract<std::ratio<1,3>, std::ratio<1,5> >::den == 15
  3. std::ratio_subtract<std::ratio<1,3>, std::ratio<7,6> >::num == -5
  4. std::ratio_subtract<std::ratio<1,3>, std::ratio<7,6> >::den == 6

D.6.4 std::ratio_multiply模板别名

std::ratio_multiply模板别名提供两个std::ratio数在编译时进行相乘(使用有理计算)。

定义

  1. template <class R1, class R2>
  2. using ratio_multiply = std::ratio<see below>;

先决条件

R1和R2必须使用std::ratio进行初始化。

效果

ratio_add被定义为一个别名,如果两数可以计算,且无溢出,该类型可以表示两个std::ratio对象R1和R2的和。如果计算出来的结果溢出了,那么程序里面就有问题了。在算术溢出的情况下,std::ratio_multiply<R1, R2>应该应该与std::ratio<R1::num * R2::num, R1::den * R2::den>相同。

例子

  1. std::ratio_multiply<std::ratio<1,3>, std::ratio<2,5> >::num == 2
  2. std::ratio_multiply<std::ratio<1,3>, std::ratio<2,5> >::den == 15
  3. std::ratio_multiply<std::ratio<1,3>, std::ratio<15,7> >::num == 5
  4. std::ratio_multiply<std::ratio<1,3>, std::ratio<15,7> >::den == 7

D.6.5 std::ratio_divide模板别名

std::ratio_divide模板别名提供两个std::ratio数在编译时进行相除(使用有理计算)。

定义

  1. template <class R1, class R2>
  2. using ratio_multiply = std::ratio<see below>;

先决条件

R1和R2必须使用std::ratio进行初始化。

效果

ratio_add被定义为一个别名,如果两数可以计算,且无溢出,该类型可以表示两个std::ratio对象R1和R2的和。如果计算出来的结果溢出了,那么程序里面就有问题了。在算术溢出的情况下,std::ratio_multiply<R1, R2>应该应该与std::ratio<R1::num * R2::num * R2::den, R1::den * R2::den>相同。

例子

  1. std::ratio_divide<std::ratio<1,3>, std::ratio<2,5> >::num == 5
  2. std::ratio_divide<std::ratio<1,3>, std::ratio<2,5> >::den == 6
  3. std::ratio_divide<std::ratio<1,3>, std::ratio<15,7> >::num == 7
  4. std::ratio_divide<std::ratio<1,3>, std::ratio<15,7> >::den == 45

D.6.6 std::ratio_equal类型模板

std::ratio_equal类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_equal:
  3. public std::integral_constant<
  4. bool,(R1::num == R2::num) && (R1::den == R2::den)>
  5. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

例子

  1. std::ratio_equal<std::ratio<1,3>, std::ratio<2,6> >::value == true
  2. std::ratio_equal<std::ratio<1,3>, std::ratio<1,6> >::value == false
  3. std::ratio_equal<std::ratio<1,3>, std::ratio<2,3> >::value == false
  4. std::ratio_equal<std::ratio<1,3>, std::ratio<1,3> >::value == true

D.6.7 std::ratio_not_equal类型模板

std::ratio_not_equal类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_not_equal:
  3. public std::integral_constant<bool,!ratio_equal<R1,R2>::value>
  4. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

例子

  1. std::ratio_not_equal<std::ratio<1,3>, std::ratio<2,6> >::value == false
  2. std::ratio_not_equal<std::ratio<1,3>, std::ratio<1,6> >::value == true
  3. std::ratio_not_equal<std::ratio<1,3>, std::ratio<2,3> >::value == true
  4. std::ratio_not_equal<std::ratio<1,3>, std::ratio<1,3> >::value == false

D.6.8 std::ratio_less类型模板

std::ratio_less类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_less:
  3. public std::integral_constant<bool,see below>
  4. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

效果

std::ratio_less可通过std::integral_constant<bool, value >导出,这里value为(R1::num*R2::den) < (R2::num*R1::den)。如果有可能,需要实现使用一种机制来避免计算结果已出。当溢出发生,那么程序中就肯定有错误。

例子

  1. std::ratio_less<std::ratio<1,3>, std::ratio<2,6> >::value == false
  2. std::ratio_less<std::ratio<1,6>, std::ratio<1,3> >::value == true
  3. std::ratio_less<
  4. std::ratio<999999999,1000000000>,
  5. std::ratio<1000000001,1000000000> >::value == true
  6. std::ratio_less<
  7. std::ratio<1000000001,1000000000>,
  8. std::ratio<999999999,1000000000> >::value == false

 

D.6.9 std::ratio_greater类型模板

std::ratio_greater类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_greater:
  3. public std::integral_constant<bool,ratio_less<R2,R1>::value>
  4. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

D.6.10 std::ratio_less_equal类型模板

std::ratio_less_equal类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_less_equal:
  3. public std::integral_constant<bool,!ratio_less<R2,R1>::value>
  4. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

D.6.11 std::ratio_greater_equal类型模板

std::ratio_greater_equal类型模板提供在编译时比较两个std::ratio数(使用有理计算)。

类型定义

  1. template <class R1, class R2>
  2. class ratio_greater_equal:
  3. public std::integral_constant<bool,!ratio_less<R1,R2>::value>
  4. {};

先决条件

R1和R2必须使用std::ratio进行初始化。

 

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



146 次浏览
9次