многопоточность и стрток - PullRequest
8 голосов
/ 30 ноября 2010

Я буду постоянно разбивать строки в многопоточном приложении, я читал, что strtok не подходит для этого, но почему?

Должен ли я рассмотреть возможность использования семафора вокруг части моего кода, которая вызывает strtok?

Ответы [ 3 ]

10 голосов
/ 30 ноября 2010

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

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

8 голосов
/ 30 ноября 2010

Используйте strtok_r () для обеспечения безопасности потока.

3 голосов
/ 30 ноября 2010

Вам нужно будет использовать strtok_r.

В некоторых нестандартных реализациях (особенно в Microsoft) strtok хранит свои значения в TLS (локальное хранилище потока), поэтому оно должно бытьхорошо для использования в нескольких потоках одновременно.Однако вы не можете разделить токенизацию для одной и той же строки по нескольким потокам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...