Bezpečný přístup z více vláken ve standardní knihovně C++
Následující pravidla zabezpečení vláken platí pro všechny třídy standardní knihovny C++ – to zahrnuje shared_ptr
, jak je popsáno níže. Někdy jsou poskytovány silnější záruky – například standardní objekty iostream, jak je popsáno níže, a typy určené pro multithreading, jako jsou ty v <atomic>
.
Objekt je bezpečný pro čtení z více vláken. Například vzhledem k objektu A je bezpečné číst A z vlákna 1 a z vlákna 2 současně.
Pokud je objekt zapsán do jednoho vlákna, musí být všechny čtení a zápisy do daného objektu na stejném nebo jiném vlákně chráněny. Pokud například vlákno 1 zapisuje do A objekt A, musí být vlákno 2 znemožněno čtení nebo zápisu do A.
Je bezpečné číst a zapisovat do jedné instance typu, i když jiné vlákno čte nebo zapisuje do jiné instance stejného typu. Například vzhledem k objektům A a B stejného typu je bezpečné, když se A zapisuje ve vlákně 1 a B se čte ve vlákně 2.
shared_ptr
Více vláken může současně číst a zapisovat různé shared_ptr
objekty, i když jsou objekty kopiemi, které sdílejí vlastnictví.
iostream
Standardní objekty cin
iostream , , , cerr
wcin
clog
wcout
cout
wcerr
a wclog
dodržovat stejná pravidla jako ostatní třídy, s touto výjimkou: je bezpečné zapisovat do objektu z více vláken. Například vlákno 1 může zapisovat na cout
stejnou dobu jako vlákno 2. To však může způsobit, že výstup ze dvou vláken bude intermixován.
Poznámka:
Čtení z vyrovnávací paměti datového proudu se nepovažuje za operaci čtení. Místo toho se považuje za operaci zápisu, protože se změnil stav třídy.