localtime_r должен быть потокобезопасным, но вызывает ошибки в Valgrind DRD

Я искал Google столько, сколько мог, но я не мог найти хороших ответов на этот вопрос.

localtime_r должен быть потокобезопасной функцией для получения системного времени. Однако при проверке моего приложения с помощью Valgrind --tool=drd оно постоянно говорит мне, что для этой функции существует состояние гонки данных. Общие результаты поиска лгут мне или я просто что-то упускаю? Кажется неэффективным окружать каждый вызов localtime_r мьютексом, особенно если он в первую очередь должен быть потокобезопасным. вот как я его использую:

timeval handlerTime;
gettimeofday(&handlerTime,NULL);

tm handlerTm;
localtime_r(&handlerTime.tv_sec,&handlerTm);

Любые идеи?


person Nik    schedule 17.06.2010    source источник


Ответы (2)


Если в документация указано, что он реентерабельный (и, следовательно, поточно-безопасный), то это так.

Если когда-либо в коде (не в вашем коде) была ошибка, и функция не была на самом деле поточно-ориентированной, вы ничего не могли с этим поделать (если не использовать другую функцию), и это вы не должны исправлять это в своем коде: функция должна вести себя так, как она задокументирована.

Однако я был бы осторожен с результатами, данными valgrind. Это отличный инструмент, и я часто им пользуюсь. Но иногда это просто неправильно. А для чего-то столь же сложного, как обнаружение условий гонки, я был бы еще более осторожен в том, что он говорит. Особенно о стандартной функции, которая используется десятилетиями.

Мой совет здесь: просто игнорируйте это. Если у вас возникнут проблемы и вы считаете, что за них несет ответственность localtime_r(), напишите в соответствующий список рассылки, чтобы сообщить о проблеме, и/или используйте другую функцию.

Между тем, вы должны быть в порядке.

person ereOn    schedule 17.06.2010

Из справочной страницы:

Функции ctime_r(), localtime_r() и tzset() являются MT-Safe в многопоточных приложениях, если никакая определяемая пользователем функция не изменяет напрямую одну из следующих переменных: часовой пояс, altzone, дневной свет и tzname. Доступ к этим четырем переменным не является безопасным для MT. Они модифицируются функцией tzset() безопасным для MT способом. Функции mktime(), localtime_r() и ctime_r() вызывают tzset().

Пока вы не обращаетесь к какой-либо из этих переменных непосредственно в своем коде, кажется возможным, что valgrind сообщает о ложном срабатывании. Предоставляет ли он вам какие-либо дополнительные сведения о том, где, по его мнению, существует состояние гонки внутри функции?

Если у вас нет дальнейшего подтверждения с помощью valgrind, я думаю, что безопасно продолжать использовать его без дополнительных блокировок.

person Mark B    schedule 21.06.2010