Итак, следующий код, который я использую для исправления производственного процесса из-за нехватки времени. По сути, у меня есть функция 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
, если это имеет значение
РЕДАКТИРОВАТЬ: многопоточный, тот же вывод.