Czy odrodzenie wątku samo w sobie zapewnia gwarancje kolejności pamięci?

20

Chcę z grubsza to zrobić:

Początkowy wątek:

  • napisz niektóre wartości do globalnych zmiennych (nigdy więcej nie zostaną zapisane)
    • Mogą to być umiarkowanie duże dane (tablice, ciągi itp.). Nie można tego po prostu zrobić std::atomic<>.
  • spawnuj inne wątki

Inne wątki:

  • przeczytaj stan globalny
  • pracować, itp.

Teraz wiem, że mogę przekazywać argumenty std::thread, ale w tym przykładzie staram się zrozumieć gwarancje pamięci C ++.

Ponadto jestem całkiem pewien, że w każdej rzeczywistej implementacji utworzenie wątku spowoduje powstanie bariery pamięci zapewniającej, że wątek będzie „widział” wszystko, co napisał wątek nadrzędny do tego momentu.

Ale moje pytanie brzmi: czy gwarantuje to standard?

Poza tym: Przypuszczam, że mógłbym dodać jakiś manekin std::atomic<int>lub coś takiego i napisać o tym przed uruchomieniem innych wątków, a następnie w innych wątkach, przeczytaj to raz przy uruchomieniu. Wierzę, że wszystko, co się wydarzy, zanim maszyny zagwarantują, że wcześniej napisany stan globalny będzie odpowiednio widoczny.

Ale moje pytanie brzmi: czy coś takiego jest technicznie wymagane, czy wystarczy tworzenie wątków?

jwd
źródło
Chyba mógłbym dodać trochę smoczka std::atomic<int>... Możesz użyć std::atomic_thread_fence.
Rin Kaenbyou
@NathanOliver d'oh. usunięty komentarz. Nie mogę policzyć, jak często mi tu pomagałeś, bez względu na to, jak głupie są moje pytania ...
idclev 463035818
1
@ idclev463035818 Bez obaw. Zdarza się nam wszystkim.
NathanOliver

Odpowiedzi:

26

Wystarczy utworzyć wątek. Istnieje punkt synchronizacji między konstruktorem wątków a początkiem nowego wątku na [thread.thread.constr] / 7

Synchronizacja: Zakończenie wywołania konstruktora synchronizuje się z początkiem wywołania kopii f.

Oznacza to, że cały stan w wątku przed spawnowaniem nowego wątku jest widoczny dla spawnowanego wątku.

NathanOliver
źródło