В чем смысл небезопасности в C++?


person SpeedBirdNine    schedule 13.12.2011    source источник


Ответы (1)


strtok не является потокобезопасным. Если два или более потока вызывают strtok одновременно, результаты будут неопределенными. Я воспроизвожу здесь ответ другого пользователя, Джонатана Леффлера:

Имейте в виду, что strtok() уничтожает ввод при его обработке. Кроме того, он не является потокобезопасным, и вы должны быть уверены, что никакая другая функция, которую вы вызываете из вашего синтаксического анализатора, не использует strtok(), и что никакая функция, вызывающая ваш синтаксический анализатор, не использует strtok(). Условия для вызываемых функций обычно не слишком обременительны; однако в библиотечном коде второе условие (без вызова функции, также использующей strtok()) не может быть реализовано.

Ответ был дан на этот вопрос: Работа с вводом в C

person Tudor    schedule 13.12.2011
comment
Хуже того, если два или более потока вызывают strtok одновременно для разных строк, результаты не определены. Причина в том, что strtok запоминает, для какой строки вы вызывали ее в последний раз, так что вы можете передать нулевой указатель при повторном вызове. strtok не может быть реализован потокобезопасным способом. - person Steve Jessop; 13.12.2011
comment
@Steve Jessop: Спасибо, я отредактировал, чтобы удалить ту же часть. - person Tudor; 13.12.2011