成功的settimeofday()随机函数锁定了应用程序

时间:2016-12-21 12:11:59

标签: c++ multithreading debian ntp

我有一个在Raspberry Pi(DietPi Distro - Jessie)上运行的C ++应用程序,我正在使用GPS数据来更新启动时的系统时间。代码很简单,然而,它在大约50%的时间内崩溃或锁定应用程序。没有抛出异常,我试图捕获日志文件中的任何stderr但没有成功。偶尔我会看到一个分段错误,但我认为这可能是无关的。

明显导致崩溃的代码部分是“settimeofday(& tv,NULL)”。我只能注释掉它,它会运行正常,但这里是代码段,分配timeval'tv'并改变系统时间:

//Convert gps_data_t* member 'time' to timeval
timeval tv;
double wholeseconds, decimalseconds, offsettime;
offsettime = gpsdata->fix.time - (5.0 * 3600.0);
decimalseconds = modf(offsettime, &wholeseconds);
tv.tv_sec = static_cast<int32_t>(wholeseconds);
tv.tv_usec = static_cast<int32_t>(decimalseconds * 1000000.0);

//Set system time - THIS IS CAUSING CRASHES, WHY?
if ( settimeofday(&tv, NULL) >= 0) {
    std::cout << "Time set successful!" << '\n';
} else {
    std::cout << "Time set failure!" << '\n';
}

我想提出的一点是,当系统崩溃时,时间设置成功。在gpsdata-&gt; fix.time是'NaN'的情况下,我看到它没有成功,它似乎很好地处理了这个并报告了一个失败。我自己的可能原因理论:

  

这是一个多线程程序,其中有几个其他线程在   睡眠状态(std :: this_thread :: sleep_for()广泛使用)。是否   在这些线程处于睡眠状态时更改系统时间   干扰睡眠时间?

     

我知道Debian发行版中有时间服务(NTP?)   管理系统时间同步。这会干扰吗?

无论如何,我还有更多的实验要做但似乎有些人可能会立刻认出来。所有建议都表示赞赏。

其他几点,我已经按照this链接删除了ntpd服务,问题仍然存在,裁定导致问题。此外,我发现this链接表示在睡眠线程期间更改系统时间不会影响其唤醒时间。所以现在我的两个理论都被拍了。感谢任何其他想法!

由于偶尔发生的分段故障,如果它与冻结/崩溃有关,这是不明确的,我继续更新代码以防止我能识别的唯一未定义行为来源。所以我为modf函数中使用的所有变量添加了统一初始化,并使我的timeval为const。还改变了以下建议中的类型转换。行为仍然是一样的。

//Loop until first GPS lock to set system time
while ( (gpsdata == NULL) ||
        (gpsdata->fix.mode <= 1) ||
        (gpsdata->fix.time < 1) ||
        std::isnan(gpsdata->fix.time) ) {
    gpsdata = gps_rec.read();
}

//Convert gps_data_t* member 'time' to timeval
double offsettime{ gpsdata->fix.time - (5.0 * 3600.0) };    //5.0 hr offset for EST
double seconds{ 0.0 };
double microseconds{ 1000000.0 * modf(offsettime, &seconds) };
const timeval tv{ static_cast<time_t>(seconds),
                  static_cast<suseconds_t>(microseconds) };

//Set system time - THIS IS CAUSING CRASHES, WHY?
if ( settimeofday(&tv, NULL) >= 0) {
    std::cout << "Time set successful!" << '\n';
} else {
    std::cout << "Time set failure!" << '\n';
}

0 个答案:

没有答案