C++ 標準ライブラリ内のスレッド セーフThread Safety in the C++ Standard Library

次のスレッド セーフの規則は C++ 標準ライブラリのすべてのクラスに適用されます。これには、次に示すように shared_ptr が含まれます。The following thread safety rules apply to all classes in the C++ Standard Library—this includes shared_ptr, as described below. より強力な保証が提供されることがあります。たとえば、次に示すような標準の iostream オブジェクトや、のようなマルチスレッド用の型などがあり <atomic> ます。Stronger guarantees are sometimes provided—for example, the standard iostream objects, as described below, and types intended for multithreading, like those in <atomic>.

オブジェクトは、複数のスレッドからの読み取りに対してスレッド セーフです。An object is thread-safe for reading from multiple threads. たとえば、オブジェクト A が指定された場合、スレッド 1 とスレッド 2 から A の同時読み取りを安全に行うことができます。For example, given an object A, it is safe to read A from thread 1 and from thread 2 simultaneously.

あるオブジェクトに対して 1 つのスレッドが書き込みを行っている場合、同じスレッドまたは別のスレッドでのそのオブジェクトに対する読み取りと書き込みはすべて保護される必要があります。If an object is being written to by one thread, then all reads and writes to that object on the same or other threads must be protected. たとえば、オブジェクト A が指定され、スレッド 1 が A に書き込みを行っている場合、スレッド 2 で A の読み取りや書き取りを行えないようにする必要があります。For example, given an object A, if thread 1 is writing to A, then thread 2 must be prevented from reading from or writing to A.

別のスレッドが同じ型の別のインスタンスに対して読み取りまたは書き込みを行っている場合でも、型の1つのインスタンスに対して読み取りと書き込みを安全に行うことができます。It's safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type. たとえば、同じ型のオブジェクト A と B が指定されている場合、がスレッド1で書き込まれ、B がスレッド2で読み取られると、安全です。For example, given objects A and B of the same type, it's safe when A is being written in thread 1 and B is being read in thread 2.


shared_ptrオブジェクトが所有権を共有するコピーであっても、複数のスレッドが同時に異なるオブジェクトの読み取りと書き込みを行うことができます。Multiple threads can simultaneously read and write different shared_ptr objects, even when the objects are copies that share ownership.


標準の iostream オブジェクト、、、、、、 cin cout cerr 、およびは、 clog wcin wcout wcerr wclog 他のクラスと同じ規則に従いますが、例外として、複数のスレッドからオブジェクトに安全に書き込むことができます。The standard iostream objects cin, cout, cerr, clog, wcin, wcout, wcerr, and wclog follow the same rules as the other classes, with this exception: it's safe to write to an object from multiple threads. たとえば、スレッド1はスレッド2と同時にに書き込むことができ cout ます。For example, thread 1 can write to cout at the same time as thread 2. ただし、2 つのスレッドからの出力が混ざる可能性があります。However, this can cause the output from the two threads to be intermixed.


ストリーム バッファーからの読み取りは、読み取り操作とは見なされません。Reading from a stream buffer is not considered to be a read operation. 代わりに、クラスの状態が変更されるため、書き込み操作と見なされます。Instead it's considered to be a write operation because the state of the class is changed.

関連項目See also

C++ 標準ライブラリの概要C++ Standard Library Overview