std::thread: łączenie i odłączanie
Uruchamiaj wątki za pomocą std::thread i wybieraj między join a detach
std::thread: łączenie i odłączanie to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Klasa std::thread
Nagłówek <thread> wprowadził obsługę wątków do biblioteki standardowej w C++11. Każda instancja std::thread reprezentuje jeden wątek systemu operacyjnego.
Tworzenie wątku
Do konstruktora należy przekazać obiekt wywoływalny (funkcję, lambdę lub funktor). Wątek rozpoczyna wykonywanie natychmiast.
#include <thread>
#include <iostream>
void worker() { std::cout << "running on thread\n"; }
int main() {
std::thread t(worker);
t.join(); // wait for it to finish
}Przekazywanie argumentów
Argumenty należy przekazać do obiektu wywoływalnego za pośrednictwem konstruktora.
std::thread t([](int n) { std::cout << n; }, 42);
t.join();Przekazywanie przez referencję
Aby przekazać argumenty przez referencję, należy użyć std::ref. Bez tego wątek otrzyma kopie.
int counter = 0;
std::thread t([](int& c) { ++c; }, std::ref(counter));
t.join();
std::cout << counter; // 1join(): oczekiwanie na zakończenie
Należy wywołać join(), aby zablokować wątek wywołujący do czasu zakończenia wątku docelowego. Po wywołaniu join wątek nie jest już możliwy do przyłączenia.
detach(): niezależne wykonywanie
Należy wywołać detach(), aby uruchomić wątek niezależnie. Wątek będzie działać po zniszczeniu obiektu std::thread. Zasoby zostaną zwolnione przez system operacyjny po zakończeniu wątku.
std::thread t([]() { /* background work */ });
t.detach(); // we no longer track itjoinable()
Należy sprawdzić, czy wątek można przyłączyć lub odłączyć. Wątek, który został przyłączony lub odłączony, nie jest już możliwy do przyłączenia.
Zapomnienie o join: zakończenie programu
Jeśli obiekt std::thread zostanie zniszczony, gdy nadal można go przyłączyć, program wywoła std::terminate. Przed zniszczeniem obiektu zawsze należy wykonać join lub detach.
Opakowanie RAII
Należy napisać niewielkie opakowanie RAII, które w destruktorze wykonuje join. Można też użyć std::jthread (C++20) — ten typ automatycznie wykonuje join.
#include <thread>
// C++20
std::jthread t([] { /* work */ });
// t joins automatically when destroyedWspółbieżność sprzętowa
Liczbę wątków sprzętowych należy odczytać za pomocą std::thread::hardware_concurrency(). Można jej użyć do określenia rozmiaru puli wątków.
Identyfikatory wątków
Każdy wątek ma unikatowy identyfikator. Identyfikator bieżącego wątku można pobrać za pomocą std::this_thread::get_id().
Usypianie wątku
Do wstrzymania bieżącego wątku należy użyć std::this_thread::sleep_for(duration).
#include <chrono>
using namespace std::chrono_literals;
std::this_thread::sleep_for(500ms);Szybkie sprawdzenie
Co się stanie, jeśli obiekt std::thread, który można przyłączyć, zostanie zniszczony przed wywołaniem join() lub detach()?
Podsumowanie
Wątki należy tworzyć za pomocą std::thread i obiektu wywoływalnego. Przed zniszczeniem obiektu wątku zawsze należy wykonać join() lub detach() — albo użyć std::jthread (C++20), który automatycznie wykonuje join.
Często zadawane pytania
Czy lekcja „std::thread: łączenie i odłączanie” jest bezpłatna?
Tak — pełny tekst „std::thread: łączenie i odłączanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „std::thread: łączenie i odłączanie”?
Uruchamiaj wątki za pomocą std::thread i wybieraj między join a detach Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „std::thread: łączenie i odłączanie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- std::thread: łączenie i odłączanie
- std::mutex, lock_guard i unique_lock
- Zmienne warunkowe i wzorce pracowników
- Podstawy std::async i std::future