@@ -757,7 +757,7 @@ std::shared_future<std::string>sf{ p.get_future() }; // 隐式转移所有权
757
757
758
758
阻塞调用会将线程挂起一段(不确定的)时间,直到对应的事件发生。通常情况下,这样的方式很好,但是在一些情况下,需要限定线程等待的时间,因为无限期地等待事件发生可能会导致性能下降或资源浪费。一个常见的例子是在很多网络库中的 `connect` 函数,这个函数调用是阻塞的,但是也是限时的,一定时间内没有连接到服务器就不会继续阻塞了,会进行其它处理,比如抛出异常。
759
759
760
- 介绍两种指定超时的方式,一种是“**时间段**”,另一种是“**时间点**”,其实就是先前讲的 [`std::this::thread::sleep_for`](https://zh.cppreference.com/w/cpp/thread/sleep_for) 与 [`std::this_thread::sleep_until`](https://zh.cppreference.com/w/cpp/thread/sleep_until) 的区别。前者是需要指定等待一段时间(比如 10 毫秒)。而后者是指定等待到一个时间点 (比如到 2024-05-07T12:01:10.123)。多数函数都对两种超时方式进行处理。**处理持续时间的函数以 `_for` 作为后缀,处理绝对时间的函数以 `_until` 作为后缀**。
760
+ 介绍两种指定超时的方式,一种是“**时间段**”,另一种是“**时间点**”,其实就是先前讲的 [`std::this::thread::sleep_for`](https://zh.cppreference.com/w/cpp/thread/sleep_for) 与 [`std::this_thread::sleep_until`](https://zh.cppreference.com/w/cpp/thread/sleep_until) 的区别。前者是需要指定等待一段时间(比如 10 毫秒)。而后者是指定等待到一个具体的时间点 (比如到 2024-05-07T12:01:10.123)。多数函数都对两种超时方式进行处理。**处理持续时间的函数以 `_for` 作为后缀,处理绝对时间的函数以 `_until` 作为后缀**。
761
761
762
762
条件变量 `std::condition_variable` 的等待函数,也有两个超时的版本 [`wait_for`](https://zh.cppreference.com/w/cpp/thread/condition_variable/wait_for) 和 [`wait_until`](https://zh.cppreference.com/w/cpp/thread/condition_variable/wait_until) 。它们和我们先前讲的 `wait` 成员函数一样有两个重载,可以选择是否传递一个[*谓词*](https://zh.cppreference.com/w/cpp/named_req/Predicate)。它们相比于 `wait` 多了一个解除阻塞的可能,即:**超过指定的时长或抵达指定的时间点**。
763
763
@@ -795,7 +795,7 @@ std::chrono::minutes std::chrono::duration</* int29 */, std::ratio<60>>
795
795
796
796
稳定时钟的主要优点在于,它可以提供相对于起始时间的稳定的递增时间,因此适用于需要保持时间顺序和不受系统时间变化影响的应用场景。相比之下,像 [ ` std::chrono::system_clock ` ] ( https://zh.cppreference.com/w/cpp/chrono/system_clock ) 这样的系统时钟可能会受到系统时间调整或变化的影响,因此在某些情况下可能不适合对时间间隔进行精确测量。
797
797
798
- 不管使用哪种时钟获取时间,C++ 提供了函数 ,可以将时间点转换为 [ ** time_t** ] ( https://zh.cppreference.com/w/cpp/chrono/c/time_t ) 类型的值:
798
+ 不管使用哪种时钟获取时间,C++ 都提供了函数 ,可以将时间点转换为 [ ** time_t** ] ( https://zh.cppreference.com/w/cpp/chrono/c/time_t ) 类型的值:
799
799
800
800
``` cpp
801
801
auto now = std::chrono::system_clock::now();
@@ -853,16 +853,16 @@ auto one_hour = 1h;
853
853
当不要求截断值的情况下(时转换为秒时没问题的,但反过来不行)时间段有隐式转换,显式转换可以由 [`std::chrono::duration_cast<>`](https://zh.cppreference.com/w/cpp/chrono/duration/duration_cast) 来完成。
854
854
855
855
```cpp
856
- std::chrono::milliseconds ms( 3999) ;
856
+ std::chrono::milliseconds ms{ 3999 } ;
857
857
std::chrono::seconds s = std::chrono::duration_cast<std::chrono::seconds>(ms);
858
- std::cout << s << '\n';
858
+ std::cout << s.count() << '\n';
859
859
```
860
860
861
861
这里的结果是截断的,而不会进行所谓的四舍五入,最终的值是 ` 3 ` 。
862
862
863
863
时间库支持四则运算,可以对两个时间段进行加减乘除。时间段对象可以通过 [ ` count() ` ] ( https://zh.cppreference.com/w/cpp/chrono/duration/count ) 成员函数获得计次数。例如 ` std::chrono::milliseconds{123}.count() ` 的结果就是 123。
864
864
865
- 基于时间段的等待都是由 ` std::chrono::duration<> ` 来完成。例如:等待 future 35 毫秒变为就绪状态。
865
+ 基于时间段的等待都是由 ` std::chrono::duration<> ` 来完成。例如:等待一个 future 对象在 35 毫秒内变为就绪状态:
866
866
867
867
``` cpp
868
868
std::future<int > future = std::async([] {return 6; });
0 commit comments