wiele wątków zapisujących do std :: cout lub std :: cerr

Mam wątki OpenMP, które piszą do konsoli przez cout i cerr. To oczywiście nie jest bezpieczne, ponieważ wyjście może być przeplatane. Mógłbym zrobić coś takiego

#pragma omp critical(cerr)
{
   cerr << "my variable: " << variable << endl;
}

Byłoby ładniej, gdyby można było zastąpić cerr wersją bezpieczną dla wątków, podobną do metody wyjaśnionej w instrukcji valgrind DRD (http://valgrind.org/docs/manual/drd-manual.html#drd-manual.effective-use), która polega na wyprowadzeniu klasy ze std :: ostreambuf. Idealnie w końcu zastąpiłbym cerr moim własnym gwintowanym cerr, np. po prostu:

tcerr << "my variable: " << variable << endl;

Taka klasa może drukować na konsoli, gdy tylko napotka „endl”. Nie przeszkadza mi to, że linie z różnych wątków są przeplatane, ale każda linia powinna pochodzić tylko z jednego wątku.

Naprawdę nie rozumiem, jak działa cała ta transmisja strumieniowa w C ++, jest zbyt skomplikowana. Czy ktoś ma taką klasę lub może mi pokazać, jak stworzyć taką klasę?

questionAnswers(4)

yourAnswerToTheQuestion