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

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

спасибо.

2 ответов


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


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

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