Kontenery C++11 STL i zabezpieczenie gwintów

Mam problem ze znalezieniem jakichkolwiek aktualnych informacji na ten temat.

Czy wersje C++11 kontenerów STL mają zagwarantowany poziom bezpieczeństwa wątków?

Spodziewam się, że nie, ze względu na wydajność. Ale z drugiej strony, dlatego mamy oba std::vector::operator[] oraz std::vector::at.
Author: Azeem, 2012-10-17

3 answers

Ponieważ istniejące odpowiedzi nie pokrywają tego (tylko komentarz), wspomnę tylko o 23.2.2 [container .wymagania.dataraces] aktualnej specyfikacji standardu C++ , która mówi:

Implementacje są wymagane, aby uniknąć wyścigów danych, gdy zawartość zawartego obiektu w różnych elementach w tej samej sekwencji, z wyjątkiem vector<bool>, są modyfikowane jednocześnie.

Tzn. jest bezpieczny dostęp do różnych elementów tego samego kontenera, więc na przykład ty może mieć globalną std::vector<std::future<int>> składającą się z dziesięciu elementów i mieć dziesięć wątków, z których każdy zapisuje się do innego elementu wektora.

Poza tym, te same zasady mają zastosowanie do kontenerów, co do reszty biblioteki standardowej (patrz 17.6.5.9 [res.on.data.wyścigi]), jak mówi odpowiedź Pana C64, a dodatkowo [kontener.wymagania.dataraces] wymienia pewne nie - const funkcje składowe kontenerów, które mogą być wywoływane bezpiecznie, ponieważ zwracają one tylko nie-const odwołania do elementów, nie właściwie modyfikować cokolwiek (w ogólności każda funkcja niebędąca członkiem const musi być uważana za modyfikację.)

 36
Author: Jonathan Wakely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:16

Myślę, że kontenery STL oferują następujący podstawowy wątek-gwarancję bezpieczeństwa:

  • jednoczesne odczyty z tego samego obiektu są OK

  • jednoczesny odczyt/zapis z różne obiekty są w porządku

Ale musisz użyć jakiejś formy niestandardowej synchronizacji (np. sekcji krytycznej), jeśli chcesz zrobić coś innego, jak np. jednoczesny zapis na tym samym obiekcie.

 23
Author: Mr.C64,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 10:14:19

Nie. Sprawdź PPL lub Intel TBB dla thread safe stl-like containers.

Podobnie jak inni zauważyli, że mają zwykle "Bezpieczeństwo wielu czytników", ale jest to nawet pre C++11. Ofc nie oznacza to jednego pisarza, wielu czytelników. Oznacza 0 pisarzy. :)

 -7
Author: NoSenseEtAl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 01:26:51