функция strtok потокобезопасность
Я потратил некоторое время на отладку программы, которая дает ошибку сегментации. Ошибка довольно неопределенная и прерывистая, что раздражает. Я сузил круг поисков до призыва стртока. Я подозреваю, что именно вызов strtok для разделения строки на два разных потока вызывает ошибку сегментации. Могу ли я вызвать strtok в двух разных потоках?
Спасибо.
2 ответа:
strtok()
не является реентерабельным, поэтому его не следует использовать из потоковых приложений, вместо этого используйтеstrtok_r()
.
strtok()
не является MT-безопасным, потому что он хранит некоторые промежуточные переменные глобально и повторно использует их при каждом вызове (смотрите, вам не нужно снова передавать строку каждый раз, когда вы вызываетеstrtok()
). Вы можете посмотреть на man-страницы методов, которые вы используете, и всегда указывается в конце, является ли это MT-безопасным или нет.Если метод не является MT-безопасным (многопоточным или реентерабельным), следует искать тот же метод с суффиксом _r, означающим reentrand. В вашем примере
strtok_r()
, как предложено в другом примере ответ.