C ++ повышает таймер крайнего срока asio и устойчивые сбои таймера, приводящие к ошибке сегментации, когда системное время не синхронизировано - PullRequest
0 голосов
/ 07 мая 2019

Я использую Linux-машину с: версия clang: буст-версия 3.5.0: 1.68.0

Я использую raspberry pi3 в качестве моей сборочной машины.Твист иногда означает, что системное время rpi3 не синхронизировано с фактическим временем и установлено значение по умолчанию 1 января 1970 года. Теперь мой проект использует таймеры крайних сроков для выполнения задачи цикла с использованием цикла реактора наддува и согласно моей логике, как только rpi3 загрузит мойдолжен выполняться код (с таймером крайнего срока).

Пример:

Код, который регистрирует запись каждую минуту, как только rpi3 загружается в базе данных.

проблема здесь, когдаСистемные часы rpi3 не синхронизируются с точным временем, они работают нормально, но как только они синхронизируются с реальным временем, мой код вылетает точно в таймеры крайнего срока.

Я прочитал и обнаружил, что таймеры крайнего срока дают неожиданное поведение при настройке системных часов: boost :: deadline_timer может не работать при изменении системных часов

и для таких случаев использования, какэти мы должны использовать устойчивые таймеры.

Я тоже пробовал, но это показывает то же самое поведение.Может ли кто-то пролить свет на то, неправильно ли я реализовал установившийся таймер или я неправильно понял концепцию.

Ниже приведен мой код:

boost::asio::basic_waitable_timer<boost::chrono::steady_clock> steadyWaitTimer(*io_service);

void loopFunction(){
boost::asio::basic_waitable_timer<boost::chrono::steady_clock, boost::asio::wait_traits<boost::chrono::steady_clock> >::duration loopingDuration(boost::chrono::seconds(60));

steadyWaitTimer.expires_from_now( loopingDuration );

int startWaitTime = std::time(0);
steadyWaitTimer.async_wait([this,startWaitTime](const boost::system::error_code &ec){
        std::cout << " This async wait started at time : " << startWaitTime << " and ending at time : " << std::time(0) << std::endl << std::flush;
        if(ec == boost::asio::error::operation_aborted){
            std::cout<<"Operation aborted or say timer cancelled in asio task looper scheduleNext at time " << std::time(0) <<std::endl<<std::flush;
        }
        else {
            std::cout << "Timer expired calling scheduleNext at time : " << std::time(0) <<"\n" << std::flush;
            // want to go in loop till time is not synchronised
            loopFunction();
        }
    });

}
...