Jeśli masz wspólne zmienne między std::thread
a głównym wątkiem (lub innym wątkiem), czy nadal możesz uzyskać dostęp do tych wspólnych zmiennych, nawet jeśli można wykonać metodę thread::detach()
natychmiast po utworzeniu wątku?C++ 11 std :: thread :: odłącz i udostępnianie danych udostępnionych
Odpowiedz
Tak! Zmienne globalne, przechwycone i przekazane są nadal dostępne po wywołaniu detach()
.
Jednakże, jeśli wywołujesz odłączenie, prawdopodobnie powrócisz z funkcji, która utworzyła wątek, pozwalając obiektowi gwintu wyjść poza zakres. W takim przypadku należy zadbać o to, aby żaden z lokali tej funkcji nie był przekazywany do wątku przez odwołanie lub wskaźnik.
Możesz myśleć o detach()
jako deklaracji, że wątek nie potrzebuje niczego lokalnego do wątku tworzenia.
W poniższym przykładzie wątek nadal uzyskuje dostęp do int
na stosie wątku początkowego po tym, jak zniknął poza zasięgiem. To jest niezdefiniowane zachowanie!
void start_thread()
{
int someInt = 5;
std::thread t([&]() {
while (true)
{
// Will print someInt (5) repeatedly until we return. Then,
// undefined behavior!
std::cout << someInt << std::endl;
}
});
t.detach();
}
Oto kilka możliwych sposobów, aby zachować dywan przed przetoczyła spod Twojego wątku:
- stwierdzenie
int
gdzieś, że nie wyjdzie z zakresu czasie trwania jakichkolwiek wątków, które wymagają to (być może globalne). - Zgłaszanie udostępnionych danych jako
std::shared_ptr
i przekazywanie ich według wartości do wątku. - Przeprowadź podanie przez wartość (wykonanie kopii) do wątku.
- Przeprowadź przez wątek referencję rvalue (wykonując ruch).
Tak. Odłączanie nici oznacza, że po zakończeniu czyszczenia samo się oczyszcza i nie ma już potrzeby, ani nie jest to dozwolone.
- 1. Problem z std :: thread z C++ 11
- 2. XCode std :: thread C++
- 3. MinGW i std :: thread
- 4. Używanie atomów z std :: thread w C++ 11
- 5. Wywoływanie funkcji automatycznie na wyjściu std :: thread w C++ 11
- 6. C++ std :: thread funkcji elementu
- 7. C++ std :: wektor niezależnych std :: thread
- 8. : użycie usuniętej funkcji "std :: thread :: thread (const std :: thread &)"
- 9. Jak standardowe jest std :: thread?
- 10. blokowanie udostępnionych danych przy użyciu C#
- 11. C++ 11 std :: wektor w środowisku współbieżnym
- 12. C++ 11 szablony variadic i std :: endl
- 13. Jak przerwać std :: thread?
- 14. Jak std :: thread sleep
- 15. std :: thread - nazewnictwo twojego wątku
- 16. Usunąć std :: thread po wywołaniu join?
- 17. Jak zdobyć -std = C++ 11 w/libstdC++?
- 18. Zwiększenie read_json i C++ 11
- 19. Pobierz std :: thread, aby się odłączyć i zakończyć samoczynnie
- 20. Udostępnianie danych między JVM
- 21. Dlaczego dodano std :: isblank w C++ 11?
- 22. C++ 11 std :: ustaw funkcję porównania lambda
- 23. std :: atomic z niestandardową klasą (C++ 11)
- 24. Odłącz kontra usuń w C++
- 25. C++ 11 std :: shared_ptr + boost :: serializacja
- 26. C++ 11: Prawidłowa inicjalizacja std :: array?
- 27. std :: unique_ptr jako parametr do działania w std :: thread
- 28. Jak przekonwertować std :: thread :: id na ciąg w C++?
- 29. C++ 11 auto i size_type
- 30. Bieżący stan obsługi drd i helgrind dla std :: thread