функция strtok потокобезопасность


Я потратил некоторое время на отладку программы, которая дает ошибку сегментации. Ошибка довольно неопределенная и прерывистая, что раздражает. Я сузил круг поисков до призыва стртока. Я подозреваю, что именно вызов strtok для разделения строки на два разных потока вызывает ошибку сегментации. Могу ли я вызвать strtok в двух разных потоках?

Спасибо.

2 17

2 ответа:

strtok() не является реентерабельным, поэтому его не следует использовать из потоковых приложений, вместо этого используйте strtok_r().

strtok() не является MT-безопасным, потому что он хранит некоторые промежуточные переменные глобально и повторно использует их при каждом вызове (смотрите, вам не нужно снова передавать строку каждый раз, когда вы вызываете strtok()). Вы можете посмотреть на man-страницы методов, которые вы используете, и всегда указывается в конце, является ли это MT-безопасным или нет.

Если метод не является MT-безопасным (многопоточным или реентерабельным), следует искать тот же метод с суффиксом _r, означающим reentrand. В вашем примере strtok_r(), как предложено в другом примере ответ.