2010-06-17 4 views
1

Я искал Google столько, сколько мог, но я не мог найти никаких хороших ответов на это.localtime_r должен быть потокобезопасным, но вызывает ошибки в Valgrind DRD

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

timeval handlerTime; 
gettimeofday(&handlerTime,NULL); 

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

Любые идеи?

ответ

1

Если documentation говорит, что это возвратного (и, таким образом, поточно-), то есть.

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

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

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

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

1

Из страницы руководства:

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

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

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

Смежные вопросы