1# 三方库Changelog 2 3## libc++ condition_variable::wait_for接口变更 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11变更前,libc++库condition_variable::wait_for接口使用系统墙上时间,受到修改系统时间的影响,和开发者预期不符合。 12 13``` 14template <class _Rep, class _Period> 15cv_status 16condition_variable::wait_for(unique_lock<mutex>& __lk, 17 const chrono::duration<_Rep, _Period>& __d) 18{ 19 ... 20 21#if defined(_LIBCPP_HAS_COND_CLOCKWAIT) 22 using __clock_tp_ns = time_point<steady_clock, nanoseconds>; 23 __ns_rep __now_count_ns = _VSTD::__safe_nanosecond_cast(__c_now.time_since_epoch()).count(); 24#else 25 using __clock_tp_ns = time_point<system_clock, nanoseconds>; 26 __ns_rep __now_count_ns = _VSTD::__safe_nanosecond_cast(system_clock::now().time_since_epoch()).count(); 27#endif 28 29 ... 30 __do_timed_wait(...); 31 ... 32} 33``` 34 35``` 36void 37condition_variable::__do_timed_wait(unique_lock<mutex>& lk, 38 chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp) noexcept 39{ 40 ... 41 nanoseconds d = tp.time_since_epoch(); 42 if (d > nanoseconds(0x59682F000000E941)) 43 d = nanoseconds(0x59682F000000E941); 44 ... 45 int ec = __libcpp_condvar_timedwait(&__cv_, lk.mutex()->native_handle(), &ts); 46 ... 47} 48``` 49 50其中0x59682F000000E941 ns = 6442450944s = 2174-02-25 17:42:24,当系统当前时间加上wait_for接口入参需要等待的时间超过该值时被截断,__libcpp_condvar_timedwait会立即返回。 51 52**变更影响** 53 54此变更涉及应用适配。 55 56- 变更前:libc++库condition_variable::wait_for接口使用系统墙上时间,受修改系统时间影响;当系统当前时间加上接口入参需要等待的时间超过特定值(0x59682F000000E941),condition_variable::wait_for接口会立即返回。 57 58- 变更后:libc++库condition_variable::wait_for接口使用单调递增时间,不受修改系统时间影响。 59 60**起始API Level** 61 629 63 64**变更发生版本** 65 66从OpenHarmony SDK 6.0.0.39开始。 67 68**适配指导** 69 70libc++库以二进制的形式发布在NDK中(libc++_shared.so)。condition_variable::wait_for接口原型未变,只是实现和C++标准、安卓、iOS、Windows等平台保持一致,开发者更新NDK后重新编译应用即可。 71