strtok безопасен в Visual C ++ (но больше нигде), поскольку он использует локальное хранилище потоков для сохранения своего состояния между вызовами. В других местах глобальная переменная используется для сохранения состояния strtok ().
Однако даже в VC ++, где strtok является потокобезопасным, это все еще немного странно - вы не можете использовать strtok () для разных строк в одном потоке в одно и то же время. Например, это не сработает:
token = strtok( string, seps );
while(token)
{
printf("token=%s\n", token)
token2 = strtok(string2, seps);
while(token2)
{
printf("token2=%s", token2);
token2 = strtok( NULL, seps );
}
token = strtok( NULL, seps );
}
Причина, по которой это не сработало бы - для каждого потока в локальном хранилище потока может быть сохранено только одно состояние, и здесь нужно 2 состояния - для первой строки и для второй строки. Так что, хотя strtok является поточно-ориентированным с VC ++, он не является реентерабельным.
Что обеспечивает strtok_s (или strtok_r везде) - явное состояние, и с этим strtok становится реентерабельным.