Вам не следует использовать strtok
или strtok_r
вообще.Писать свои собственные функции, подобные этим, но лучше, точно так, как вы хотите их использовать, тривиально, и, конечно, вызывающая сторона хранит все состояния и передает указатель на состояние для безопасности потока / повторного входа.
Что касается вашего вопроса об использовании семафора (или другого блокирующего примитива) вокруг вызовов на strtok
, это не поможет, если вы просто поместите его вокруг фактического вызова.Вам придется удерживать блокировку в течение всего процесса анализа строки, чтобы защитить внутреннее состояние strtok
.Я считаю, что это то, что многие люди называют код блокировки вместо данных , и это обычно считается A Bad Thing .