Подтвердить что ты не робот

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

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

Благодарю.

4b9b3361

Ответ 1

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

Ответ 2

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

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