Programowanie wielowątkowe w języku C++

Zakres szkolenia

W trakcie szkolenia omawiane są zagadnienia dotyczące programowanie współbieżnego w języku C++11. Uczestnicy szkolenia zapoznają się z metodami tworzenia, łączenia oraz kończenia wątków. Szczegółowo prezentowane są również sposoby synchronizacji wątków przy dostępie do zasobów współdzielonych (muteksy, zmienne warunkowe, zmienne atomowe itp.). Uczestnicy szkolenia uczą się również tworzenia bezpiecznych wielowątkowo struktur danych (thread-safe queue) oraz implementacji wzorców Thread Pool i Active Object.


Plan szkolenia

Wprowadzenie do programowanie współbieżnego

  • Procesy oraz wątki
  • Podstawowe pojęcia: poprawność programu, wyścig, wzajemne wykluczenie, żywotność, zagłodzenie wątków, zakleszczenie

Zarządzanie wątkami

  • Klasa std::thread
  • Tworzenie i uruchamianie zadań w osobnych wątkach
  • Łączenie i odłączanie wątków - implentacja RAII dla wątków
  • Grupowanie wątków - przechowywanie wątków w kontenerach standardowych
  • Wątki sprzętowe
  • Bezpieczna obsługa wyjątków w wątkach - std::exception_ptr

Synchronizacja wątków - muteksy

  • Koncepty obiektów blokowalnych
  • Muteksy w bibliotece standardowej
    • Klasy std::mutex, std::timedmutex, std::sharedmutex
    • Wersje rekursywne muteksów
  • Zarządzanie blokadami - klasy std::lockguard<Mutex> oraz std::uniquelock<Mutex>
  • Synchronizacja dostępu do obiektów za pomocą muteksów - wzorzec Monitor
  • Unikanie zakleszczeń - funkcja std::lock()
  • Blokady współdzielone - implementacja problemów typu readers-writers

Synchronizacja zdarzeń między wątkami

  • Busy waits - flagi atomowe
  • Idle waits - blokady warunkowe
  • Mechanizmy komunikacji między wątkami
    • Klasy std::conditionvariable oraz std::conditionvariable_any
  • Implementacja klasy ThreadSafeQueue oraz wzorca Producer-Consumer

Leniwa inicjalizacja obiektów

  • Jednokrotna inicjalizacja - implementacja thread-safe wzorców Singleton oraz Virtual Proxy

Wstęp do typów atomowych

  • Klasa std::atomic<T>
  • Semantyka Acquire-Release operacji synchronizujących
  • Algorytmy i struktury danych lock-free - wstęp

Funkcje wywoływane asynchronicznie

  • Wywołania asynchroniczne funkcji z wykorzystaniem biblioteki standardowej - std::async()
  • Uruchamianie zadań asynchronicznych - Klasa std::packaged_task
  • Odczytywanie wyników zwracanych przez funkcje asynchroniczne - obiekty typu "future"
  • Mechanizm komunikacji między wątkami za pomocą klasy std::promise

Podstawowe wzorce programowania współbieżnego

  • Thread Pool
  • Active Object

3 dni po 8 godzin lekcyjnych