функция безопасности потока strtok - PullRequest
19 голосов
/ 27 октября 2010

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

Спасибо.

Ответы [ 2 ]

38 голосов
/ 27 октября 2010

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

6 голосов
/ 27 октября 2010

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

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

...