Threadsicherheit in der C++-Standardbibliothek
Die folgenden Threadsicherheitsregeln gelten für alle Klassen in der C++-Standardbibliothek – dazu gehört wie unten beschrieben auch shared_ptr
. Es werden manchmal stärkere Garantien bereitgestellt, z. B. die standardmäßigen Iostream-Objekte, wie unten beschrieben, und Typen, die für Multithreading vorgesehen sind, z. B. in <atomic>
.
Ein Objekt ist zum Lesen aus mehreren Threads threadsicher. Ein bestimmtes Objekt A kann z. B. sicher gleichzeitig aus Thread 1 und Thread 2 ausgelesen werden.
Wenn durch einen Thread in ein Objekt geschrieben wird, müssen alle Lese- und Schreibvorgänge im Zusammenhang mit diesem Objekt in diesem oder anderen Threads geschützt werden. Wenn z. B. Thread 1 in Objekt A schreibt, muss verhindert werden, dass Thread 2 Objekt A ausliest oder in Objekt A schreibt.
Es ist sicher, eine Instanz eines Typs zu lesen und zu schreiben, auch wenn ein anderer Thread eine andere Instanz desselben Typs liest oder schreibt. Bei bestimmten Objekten A und B desselben Typs ist es beispielsweise sicher, wenn A in Thread 1 geschrieben wird und B in Thread 2 gelesen wird.
shared_ptr
Mehrere Threads können verschiedene shared_ptr
Objekte gleichzeitig lesen und schreiben, auch wenn es sich bei den Objekten um Kopien handelt, die den Besitz teilen.
iostream
Die standardmäßigen Iostream-Objekte cin
, cout
, , clog
cerr
, wcerr
wcin
wcout
und wclog
befolgen die gleichen Regeln wie die anderen Klassen, mit dieser Ausnahme: Es ist sicher, in ein Objekt aus mehreren Threads zu schreiben. Thread 1 kann z. B. zur gleichen Zeit wie Thread 2 schreiben cout
. Dies kann allerdings zu einer Vermischung der Ausgaben zweier Threads führen.
Hinweis
Das Lesen aus einem Streampuffer wird nicht als Lesevorgang betrachtet. Stattdessen wird er als Schreibvorgang betrachtet, da der Zustand der Klasse geändert wird.