0Pricing
C++ Academy · Lekcja

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;   // 1

join(): 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 it

joinable()

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 destroyed

Współ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

  1. std::thread: łączenie i odłączanie
  2. std::mutex, lock_guard i unique_lock
  3. Zmienne warunkowe i wzorce pracowników
  4. Podstawy std::async i std::future
← Powrót do C++ Academy