std :: chrono ведет себя по-разному в руке - PullRequest
0 голосов
/ 08 января 2020

Итак, следующий код, который я использую для исправления производственного процесса из-за нехватки времени. По сути, у меня есть функция stati c, которая вызывается из многих мест, гораздо больше, чем предполагалось, и она вызывает удушение в другом разделе приложения. Поэтому я подумал, что мне нужно быстро исправить проблему, ограничивающую вызовы перегруженной функцией раз в две секунды. Это прекрасно работает в x86, используя clang или g cc.

#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;

Prints Check true после 2000 мс. Проверьте истину после 2000 мс. Проверьте истину после 2002 мс. Проверьте истину после 2005 мс. ....

Однако для нашего контроллера ARM я кросс-компилировал с использованием Linaro 7.1, и теперь условие для if stmt не выполняется, пока не пройдет 10 секунд. Мне было любопытно и сравнил 1 секунду вместо двух (duration_cast мс против секунд ничего не меняет) и if(1 <= ....count()) было верно через полсекунды.

Это ошибка в компиляторе Linaro ? Или часы для нашего контроллера ARM выключены? Флаги кросс-компиляции -mcpu=cortex-a7 -mfloat-abi=hard -marm -march=armv7ve, если это имеет значение

РЕДАКТИРОВАТЬ: многопоточный, тот же вывод.

...