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