Функция не считается «потокобезопасной», если она НЕ МОЖЕТ быть прервана в середине ее выполнения, а затем безопасно вызвана снова («повторно введена») до того, как ее предыдущие вызовы завершат выполнение.
В стандартной библиотеке C некоторые функции попадают в эту категорию. Вам не нужен такой инструмент, как Valgrind, для проверки безопасности потоков, вместо этого вы должны прочитать документацию (или страницу руководства) для конкретной функции, которая вас беспокоит.
Обычно, но не всегда, C предлагает потокобезопасный аналог, если функция не является потокобезопасной.
Например, функция токенизатора строк strtok
имеет реентерабельную версию strtok_r
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
с той разницей, что ваш код (поток) поддерживает указатель на последнюю токенизированную строку (незавершенную работу) вместо функции, поддерживающей ее. Это позволяет нескольким потокам вызывать strtok_r
параллельно.
Кроме того, вот еще одна ссылка на SO, где обсуждается поведение Threadsafe по сравнению с повторным входом.
--
ИЗМЕНИТЬ: более непосредственно связано с исходным вопросом. Я не верю, что существует такой инструмент, который может сказать вам, является ли функция реентерабельной. В этом могут помочь такие инструменты, как ltrace
. Мои комментарии выше иллюстрируют, что документация для библиотеки должна существовать, и в качестве примера я использовал стандартную библиотеку C.
Что касается Valgrind
, для него есть инструмент под названием Helgrind
, который может проверять ошибки синхронизации (см .: http://valgrind.org/docs/manual/hg-manual.html, раздел 7.1)
person
ffhaddad
schedule
18.02.2014
static
, проверять доступ к глобальным переменным и т. Д. - person John Bode   schedule 19.02.2014