Ich werde Strings in einer Multithread-Anwendung kontinuierlich aufteilen. Ich habe gelesen, dass strtok
dafür nicht geeignet ist, aber warum?
Sollte ich einen Semaphor um den Teil meines Codes verwenden, der strtok
aufruft?
Sie sollten in Erwägung ziehen, strtok
oder strtok_r
überhaupt nicht zu verwenden. Es ist trivial, ähnliche Funktionen wie diese zu schreiben, aber besser auf die Art und Weise zugeschnitten, wie Sie sie verwenden möchten. Natürlich muss der Aufrufer den gesamten Status speichern und einen Zeiger auf den Status für Thread-Sicherheit / Neueintritt übergeben. p>
Was Ihre Frage zur Verwendung eines Semaphors (oder eines anderen Sperr-Primitivs) bei Aufrufen von strtok
betrifft, hilft das nicht, wenn Sie es einfach um den tatsächlichen Aufruf herumlegen. Sie müssen die Sperre während des gesamten Analyseprozesses der Zeichenfolge beibehalten, um den internen Status von strtok
zu schützen. Ich glaube, das ist, was viele Leute als Sperrcode anstelle von Daten bezeichnen und es wird allgemein als A Bad Thing betrachtet.
Sie müssen strtok_r
verwenden.
In einigen nicht standardmäßigen Implementierungen (am häufigsten von Microsoft) speichert strtok
seine Werte in TLS (threadlokaler Speicher), daher sollte es in Ordnung sein, sie in mehreren Threads gleichzeitig zu verwenden. Sie können jedoch Ihre Tokenization für ein und dieselbe Zeichenfolge nicht über mehrere Threads aufteilen.
Tags und Links string c multithreading