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