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<>
.
- Mogą to być umiarkowanie duże dane (tablice, ciągi itp.). Nie można tego po prostu zrobić
- 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?
źródło
std::atomic<int>
... Możesz użyćstd::atomic_thread_fence
.Odpowiedzi:
Wystarczy utworzyć wątek. Istnieje punkt synchronizacji między konstruktorem wątków a początkiem nowego wątku na [thread.thread.constr] / 7
Oznacza to, że cały stan w wątku przed spawnowaniem nowego wątku jest widoczny dla spawnowanego wątku.
źródło