0

因此,由于时间限制,我正在使用以下代码进行 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是否有所作为

编辑:多线程,相同的输出。

4

0 回答 0