{"id":22218294,"url":"https://github.com/coders-school/multithreading","last_synced_at":"2025-07-27T14:32:40.866Z","repository":{"id":36447204,"uuid":"177177294","full_name":"coders-school/multithreading","owner":"coders-school","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-04T11:19:18.000Z","size":32598,"stargazers_count":4,"open_issues_count":3,"forks_count":52,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-04-04T12:30:47.754Z","etag":null,"topics":["c-plus-plus","cplusplus","cplusplus-17","cpp","cpp17","multithreading"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coders-school.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-22T16:46:46.000Z","updated_at":"2023-04-09T08:16:13.000Z","dependencies_parsed_at":"2023-01-17T01:46:06.357Z","dependency_job_id":null,"html_url":"https://github.com/coders-school/multithreading","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coders-school%2Fmultithreading","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coders-school%2Fmultithreading/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coders-school%2Fmultithreading/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coders-school%2Fmultithreading/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coders-school","download_url":"https://codeload.github.com/coders-school/multithreading/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227810980,"owners_count":17823289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-plus-plus","cplusplus","cplusplus-17","cpp","cpp17","multithreading"],"created_at":"2024-12-02T22:20:11.242Z","updated_at":"2024-12-02T22:20:12.040Z","avatar_url":"https://github.com/coders-school.png","language":"C++","readme":"# Wielowątkowość i współbieżność w C++\n\n## Tematy\n\n01. Teoria Wielowątkowości (multithreading theory)\n02. Wątki (threads) - [Test](https://forms.gle/yRATL7rzMfTSnrGa9)\n03. Współdzielenie danych (data_sharing) - [Test](https://forms.gle/s517xwB7ZKpMgPTV6)\n04. Zmienne warunku (condition_variable) - [Test](https://forms.gle/e9uHQLAcYauHbtPS9)\n05. Zmienne atomowe i model pamięci (atomic) - [Test](https://forms.gle/rFtDNbJyiLqe7vef9)\n06. Jednokrotne wywołania (call_once) - [Test](https://forms.gle/Vu6bUc5VEtZ69MRr7)\n07. Komunikacja jednokierunkowa (future, promise) - [Test](https://forms.gle/v8JvUtaXHNoXe2JGA)\n08. Zadania asynchroniczne (async, packaged_task) - [Test](https://forms.gle/AtASJcopK4uFJCSr8)\n09. Problemy współbieżności  ----------------┐\n10. Współbieżne wzorce projektowe  ---------┼- [Test z 08, 09, 10](https://forms.gle/GctQkxiYmZN4rKGu7)\n11. Testowanie programów współbieżnych ---┘\n\n[Ankieta oceniająca trenera - Mateusz Adamski](https://forms.gle/8Nidginm5wURfiFB6)\n\n[Ankieta oceniająca trenera - Łukasz Ziobroń](https://forms.gle/iRmdRgjzp14jdJpu7)\n\n## Prace domowe\n\n### Zadanie 1\n\n- Zagraj w [The Deadlock Empire](https://deadlockempire.github.io) i przejdź wszystkie poziomy :D Screenshot zaliczonych poziomów posłuży za dowód\n\n### Zadanie 2\n\nNapisz równoległą wersję algorytmu std::accumulate, który będzie współbieżnie sumował fragmenty kontenera. Wyniki powinny zostać również zapisane w kontenerze.\n\n- on empty returns init\n- calculate number of threads - `hardware_threads = hardware_concurrency()  0 ? hardware_concurrency() : 2`\n- divide on blocks according to the number of threads\n- create vector of results\n- run every thread in parallel\n- put results in vector element passed by reference (threads cannot return value)\n- join threads\n- accumulate results from the result vector\n- test on 1M elements and compare with standard std::accumulate\n- templatize algorithm on Iterator (depends on container) and type T sually int, double)\n\n\u003cdetails\u003e\u003csummary\u003ePodpowiedź\u003c/summary\u003e\n\u003cp\u003e\nRozwiązanie znajdziesz w książce *C++ Concurrency in Action, Anthony Williams*, listing 2.8. [Link do mojego rozwiązania opartego na ww](https://github.com/coders-school/multithreading/blob/solutions/homework/02_parallel_accumulate.cpp)\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Zadanie 3\n\nNapisz współbieżną wersję algorytmu std::count_if. Zmierz czas działania i napisz testy, pokazujące, że zwraca ona takie same wyniki, jak std::count_if.\nPorównaj go dodatkowo z std::count_if z przekazanym dodatkowym parametrem std::execution::par policy z C++17 ;)\n\n### Zadanie 4\n\nZaimplementuj problem ucztujących filozofów z użyciem wątków i mutexów.\n\n- Każdy filozof ma być kontrolowany przez oddzielny wątek.\n- Każdy sztuciec ma być chroniony przez 1 mutex\n- Postaraj się o wizualizację problemu na konsoli (np. `F1-  F2  -F3-  F4  |  F5  |` oznacza, że filozof F3 ma oba sztućce, a F1 tylko jeden)\n- Strzeż się zakleszczeń\n- Pobaw się liczbą filozofów i zobacz czy zmienia się zachowanie programu. Opisz to w komendarzu\n- Zadanie dodatkowe: Strzeż się zagłodzenia (starvation). Jest to sytuacja w której przynajmniej 1 wątek z powodu implementacji lub swojego niższego priorytetu nigdy nie dostanie wszystkich wymaganych zasobów. Doimplementuj w tym celu pewien mechanizm, który zapobiegnie zagłodzeniu.\n\n\u003cdetails\u003e\u003csummary\u003ePodpowiedź\u003c/summary\u003e\n\u003cp\u003e\nhttps://mariusbancila.ro/blog/2017/01/16/dining-philosophers-in-cpp11/\n\u003c/p\u003e\u003cp\u003e\nhttps://mariusbancila.ro/blog/2017/01/20/dining-philosophers-in-c11-chandy-misra-algorithm/\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Zadanie 5\n\n- Poszukaj informacji na temat zjawiska nazywanego fałszywym współdzielenim (**false sharing**). Jest to bardzo niemiłe zjawisko, wynikające z architektury współczesnych komputerów, które znacząco spowalnia równoległe wykonywanie programów.\n- Napisz/przepisz/skopiuj sobie kawałek kodu, który ma ten problem i zmierz czas działania programu w zależności od wielkości danych wejściowych i liczby wątków\n- Napraw problem false sharingu i zmierz czas działania programu również przy różnej wielkości danych wejściowych i liczbie wątków\n- Wyciągnij i opisz w komentarzu wnioski jak pisać kod odporny na false sharing :)\n\n\u003cdetails\u003e\u003csummary\u003ePodpowiedź\u003c/summary\u003e\n\u003cp\u003e\nMożesz spróbować zaimplementować algorytm std::fill\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Zadanie 6\n\nZaimplementuj grę w ping-ponga (zadanie `03_ping_pong.cpp` z rozdziału o zmiennych warunku)\n\n- 1 wątek wypisuje \"ping\" oraz kolejny numer\n- 2 wątek wypisuje \"pong\" oraz kolejny numer\n- Zaczyna wątek ping, a kończy zawsze pong. Wątki muszą pracować na przemian. Nie mogą być 2 pingi lub pongi po sobie. Program nie może zakończyć się pingiem, na który nie będzie odpowiedzi – ponga.\n- Zakończenie działania programu ma nastąpić albo po wykonanej liczbie odbić albo po limicie czasowym, w zależności które wystąpi pierwsze. Powód zakończenia powinien zostać wyświetlony na ekranie\n- Parametry programu:\n  - liczba odbić\n  - limit czasowy (w sekundach)\n\n### Zadanie 7\n\nRozwiąż zadania z użyciem `promise` i `future` od Ihora z katalogu [07_future_promise/homework](07_future_promise/homework)\n\n### Zadanie 8\n\nTak jak w zadaniu 2 - napisz równoległą wersję algorytmu std::accumulate, który będzie współbieżnie sumował fragmenty kontenera, ale użyj w tym celu zadań asynchronicznych\n\n### Zadanie 9 - Przetwarzanie obrazów\n\nZainstaluj sobie bibliotekę OpenCV - [Instrukcja instalacji](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)\n\nPrzerób algorytmy podane w dokumentacji na ich wielowątkowe wersje:\n\n1. [Wykrywanie wzorców](https://docs.opencv.org/master/de/da9/tutorial_template_matching.html).\n\n    Każdy wątek sprawdza inny wzorzec. Możemy jednocześnie szukać kilku rzeczy na obrazku. Na koniec wyświetl na obrazku miejsca, gdzie wybrane wzorce najbardziej pasowały. Jeden wzorzec może występować w kilku miejscach.\n\n2. [Wykrywanie linii](https://docs.opencv.org/master/dd/dd7/tutorial_morph_lines_detection.html).\n\n    Każdy wątek szuka linii pod innym kątem (0, 30, 45, 60, 90, 120, 135, 150 stopni). Musisz stworzyć odpowiednie maski. Na koniec wyświetl na jednym obrazku znalezione linie - każdy kąt innym kolorem. Możesz też dodać wyszukiwanie okręgów.\n\n---\n\n## Projekt 1: Hardkorowi filozofowie\n\nZaimplementuj trochę inną wersję [algorytmu ucztujących filozofów](https://pl.wikipedia.org/wiki/Problem_ucztujących_filozofów). Polecam pracę w grupie.\n\n- Chłop zadaje ważne egzystencjalnie pytanie 5 filozofom (wprowadź je z klawiatury)\n- Każdy filozof posiada gotowy zestaw 10 odpowiedzi (każdy filozof ma inne odpowiedzi)\n- Każdy filozof podczas myślenia ma zaimplementowany inny algorytm obliczający pewne wartości\n- Algorytmy filozofów jako parametr wejściowy przyjmują pytanie (`std::string`) oraz odpowiedź (`std::string`) i zwracają liczbę `int`. Jeśli nie masz pomysłu na różne algorytmy oblicz kilkukrotny `std::hash` z zestawu pytanie + odpowiedź.\n- Wszyscy filozofowie podczas myślenia korzystają także z bardzo mądrej księgi, która stanowi dla nich inspirację. Wielu filozofów może odczytywać księge jednocześnie. Wartości zapisane w księdze także mogą być brane pod uwagę w algorytmie.\n- Każdy filozof musi przemyśleć każdą z 10 swoich odpowiedzi, która stanowi parametr wejściowy do jego algorytmu myślenia.\n- Zadania do przemyślenia przez filozofów możesz zaimplementować jako pulę wątków (Thread Pool).\n- Każdy filozof, aby przemyśleć pojednynczą odpowiedź musi być najedzony. Nie może więc rozpocząć myślenia bez jedzenia.\n- Każdy filozof potrzebuje 2 sztućców, aby móc się najeść. Liczba szućców jest równa liczbie filozofów.\n- Każdy filozof po przemyśleniu odpowiedzi zapisuje swoje rozważania w księdze. Tylko 1 filozof na raz może zapisywać rozważania i żaden inny nie może tym momencie korzystać z księgi.\n- Przemyślenia w księdze mają następujący format:\n\n    ```cpp\n    struct {\n        string philosopher,\n        string answer,\n        int result,\n        chrono::duration period,\n        bool chosen = false,\n    }\n    ```\n\n- Żaden filozof nie może się przejeść. Po posiłku musi on poczekać 3 sekundy zanim zacznie kolejny posiłek.\n- Jeśli filozof nie jadł przez 20 sekund to umiera śmiercią głodą. Nie dopuść do tego!\n- W czasie poszukiwania odpowiedzi, możesz usypiać filozofów. W tym celu musisz z klawiatury podać odpowiednią komendę w czasie działania programu (np. sleep Platon).\n- Uśpiony filozof nie może myśleć ani jeść. Umiera on z głodu dopiero po 60 sekundach.\n- Uśpionego filozofa można obudzić podając odpowiednią komendę z klawiatury (np. wakeup Platon).\n- Na koniec każdy filozof odczytuje odpowiedź która została przez niego wybrana (oblicza max z działań `result * period`). W tym celu musi odczytać księgę, gdyż tam zapisał swoje rozważania. Przy wybranej odpowiedzi ustawia `chosen = true`.\n\nMEGA PODPOWIEDŹ: Pracuj w TDD i używaj Thread Sanitizera :)\n\n## Projekt 2: Wielowątkowy raytracer\n\n[Czym jest ray tracing? - wideo na YT](https://www.youtube.com/watch?v=JdfV2sB-Qcw)\nRozwiń [algorytm śledzenia promieni](https://pl.wikipedia.org/wiki/Śledzenie_promieni), implementując jego współbieżną wersję, która wygeneruje jakąś statyczną scenę i zapisze ją w jako obrazek (najlepiej użyj sceny chessboard).\nMożesz wykorzystać [ten kod](http://cosinekitty.com/raytrace/chapter05_cpp_code.html).\n\n- Zaimplementuj współbieżną wersję istniejącego algorytmu\n- Podziel obraz na różne sposoby pomiędzy wiele zadań asynchronicznych\n  - użyj async, future, promise i/lub packaged_task\n- Zbadaj szybkość przetwarzania w zależności od rodzaju podziału (użyj std::chrono)\n  - podział na wiersze\n  - podział na kolumny\n  - podział na prostokąty\n- Zbadaj szybkość przetwarzania w zależności od liczby współbieżnych zadań\n\n## Zakończenie\n\n1. [Wypełnij ankietę zadowolenia z kursu](https://forms.gle/6gzPT8PU6cKAY7eg8)\n2. [Obserwuj Coders School na LinkedInie](https://www.linkedin.com/company/coders-school/)\n3. [Polub Coders School na Facebooku](https://www.facebook.com/szkola.coders.school)\n4. Jeśli uważasz, że odwalam dobrą robotę to [skrobnij parę słów na ten temat na FB](https://www.facebook.com/pg/szkola.coders.school/reviews/?ref=page_internal), niech się niesie w świat ;)\n5. Zachęcam też do [potwierdzenia moich umiejętności i wystawienia mi rekomendacji na LinkedInie](https://www.linkedin.com/in/lukaszziobron/). Mogę odwdzięczyć się tym samym :)\n6. [Zapisz się na newsletter](https://coders.school/#newsletter), jeśli chcesz otrzymywać informacje o przyszłych kursach.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoders-school%2Fmultithreading","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoders-school%2Fmultithreading","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoders-school%2Fmultithreading/lists"}