boost — timed_wait не ждет

Я запускаю следующий код на ОС Linux + процессор ARM + Boost 1,51. Но код не работает должным образом, и вызов timed_wait () возвращается немедленно.

#include <boost/thread/condition.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

using namespace std;

int main()
{
boost::mutex mutex_;
boost::mutex::scoped_lock lock( mutex_ );

boost::xtime xt;
boost::condition condition;

// wait for one second or wait on lock
boost::xtime_get(&xt, boost::TIME_UTC_);

xt.sec += 1;

cout << "Before 1 second wait" << endl;
condition.timed_wait(lock, xt);
cout << "After 1 second wait" << endl;

return 0;
}

На других системах, имеющих тот же процессор ARM, но разные версии Linux + glibc + те же библиотеки Boost 1.51, код работает нормально и ждет 1 секунду.

Я попытался отладить проблему, используя strace. Я вижу разницу, когда вызов futex () не выполняется в системе, где он не работает.

вывести из системы, где работает код:

write(1, "Before 1 second wait\n", 21Before 1 second wait)  = 21
futex(0xb6fbf0dc, FUTEX_WAKE_PRIVATE, 2147483647) = 0
clock_gettime(CLOCK_REALTIME, {1438150496, 732211544}) = 0
futex(0xbef07a44, FUTEX_WAIT_PRIVATE, 1, {0, 998193456}) = -1 ETIMEDOUT (Connection timed out)
futex(0xbef07a28, FUTEX_WAKE_PRIVATE, 1) = 0
write(1, "After 1 second wait\n", 20After 1 second wait)   = 20

Выйдите из системы, где код НЕ работает:

    write(1, "Before 1 second wait\n", 21Before 1 second wait)  = 21
futex(0xb6fc90dc, FUTEX_WAKE_PRIVATE, 2147483647) = 0
clock_gettime(CLOCK_REALTIME, {1438150407, 134963583}) = 0
futex(0xbe9be988, FUTEX_WAKE_PRIVATE, 1) = 0
write(1, "After 1 second wait\n", 20After 1 second wait)   = 20

Есть ли изменение в ядре / glibc, необходимое для того, чтобы этот код работал?

1

Решение

Вместо использования тайм-аутов при использовании тайм-аутов, почему бы не использовать фактический тайм-аут?

condition.timed_wait(lock,boost::posix_time::milliseconds(1000))

Это предотвращает всякие странные проблемы.

0

Другие решения

Я смог выяснить, что происходит, изменив время ожидания от 1 до 100.

Я передал таймаут в качестве аргумента программе и использовал

xt.sec += timeout;

Когда время ожидания превышает 26, программа ждала (время ожидания — 26) секунд. Другими словами, программа ожидает 1 секунду: если время ожидания равно 27, 2 секунды: если время ожидания равно 28, и так далее …

Смещение 26 исходит из числа високосных секунд. Если информация о часовом поясе в системе содержит информацию о високосных секундах, то мы наблюдаем эту проблему. Если я изменю информацию о часовом поясе (/ etc / localtime), чтобы она указала на файл zoneinfo, в котором нет информации о високосных секундах, то API-интерфейс boost работает правильно.

0