localtime_r должен быть потокобезопасным, но приводить к ошибкам в Valgrind DRD - PullRequest
1 голос
/ 17 июня 2010

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

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

timeval handlerTime;
gettimeofday(&handlerTime,NULL);

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 июня 2010

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

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

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

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

1 голос
/ 17 июня 2010

Если документация говорит, что это reentrant (и, следовательно, thread-safe ), то это так.

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

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

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

А пока у вас все будет хорошо.

...