我正在尝试在C++ 11中实现一些跨平台代码.此代码的一部分使用std :: condition_variable实现信号量对象.当我需要在信号量上进行定时等待时,我使用wait_until或wait_for.
我遇到的问题是,似乎基于POSIX的系统上的 condition_variable的标准实现依赖于系统时钟,而不是单调时钟(另请参阅:针对POSIX规范的此问题)
这意味着如果系统时钟在过去的某个时间发生变化,我的条件变量将阻塞的时间比我预期的要长得多.例如,如果我希望我的condition_variable在1秒后超时,如果有人在等待期间将时钟调整回10分钟,则condition_variable会阻塞10分钟+ 1秒.我已经确认这是Ubuntu 14.04 LTS系统上的行为.
我需要依赖这个超时至少有些准确(即,在某些误差范围内它可能是不准确的,但如果系统时钟发生变化仍然需要执行).看起来我需要做的就是编写我自己的condition_variable版本,该版本使用POSIX函数并使用单调时钟实现相同的接口.
这听起来像很多工作 - 而且有点混乱.还有其他解决此问题的方法吗?
我正在开发一个应用程序来实例化几个MediaCodec实例,用于将流式音频和视频数据解码到Nvidia TX1开发套件上的SurfaceTexture.在使用一个音频和一个视频解码器几分钟后,我收到有关溢出弱全局引用表的错误:
A/art: art/runtime/indirect_reference_table.cc:118] JNI ERROR (app bug): weak global reference table overflow (max=51200 holes= 0 sizecheck=51200)
A/art: art/runtime/indirect_reference_table.cc:118] weak global reference table dump:
A/art: art/runtime/indirect_reference_table.cc:118] Last 100 entries (of 51200):
A/art: art/runtime/indirect_reference_table.cc:118] 51199: 0x12c00460 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51198: 0x12c00400 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51197: 0x12c003a0 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51196: 0x12c00340 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51195: 0x12c002e0 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51194: 0x12c00280 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51193: 0x12c001c0 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51192: 0x12c009a0 java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:118] 51191: cleared jweak
A/art: art/runtime/indirect_reference_table.cc:118] 51190: cleared …
Run Code Online (Sandbox Code Playgroud)