因此,由于时间限制,我正在使用以下代码进行 hacky 生产修复。基本上我有一个从许多地方调用的静态函数,比预期的要多得多,它导致应用程序的另一部分阻塞。所以我想我会想出一个快速解决方案,将对过度工作函数的调用限制为每两秒一次。这在使用 clang 或 gcc 的 x86 中工作得很好。
#include <chrono>
#include <iostream>
#include <unistd.h>
#include <thread>
static void staticfunction()
{
static std::mutex mutex;
static auto t0(std::chrono::high_resolution_clock::now());
std::unique_lock<std::mutex> lg_mutex(mutex, std::try_to_lock);
if( lg_mutex.owns_lock())
{
auto t1 = std::chrono::high_resolution_clock::now();
if( 2000 <= std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t0).count() )
{
// Make a check in other section of application
std::cout << "Check true after " << std::dec
<< std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t0).count()
<< " ms.\n";
t0 = std::chrono::high_resolution_clock::now();
}
}
}
int main()
{
while(true) {
std::thread t1(staticfunction);
std::thread t2(staticfunction);
std::thread t3(staticfunction);
std::thread t4(staticfunction);
t1.join();
t2.join();
t3.join();
t4.join();
}
return 0;
2000 毫秒后打印 Check true。2000 毫秒后检查为真。2002 毫秒后检查为真。2005 毫秒后检查为真。……
if
但是,对于我们的 ARM 控制器,我使用 Linaro 7.1 进行了交叉编译,现在stmt的条件直到 10 秒后才满足。我很好奇,并与 1 秒而不是 2 秒(duration_cast
毫秒与秒没有任何改变)if(1 <= ....count())
进行比较,半秒后是真的。
这是 Linaro 编译器中的错误吗?或者我们的 ARM 控制器的时钟是否关闭?交叉编译标志-mcpu=cortex-a7 -mfloat-abi=hard -marm -march=armv7ve
是否有所作为
编辑:多线程,相同的输出。