Proyek penutup section ini membangun program yang memakai lebih dari satu core sekaligus: menjumlahkan 4.000.000 angka dan menghitung statistiknya dengan empat thread, lalu membandingkan hasilnya dengan versi single-thread. Multithreading sering diperkenalkan sebagai topik yang penuh jebakan — data race, deadlock, hasil yang berubah-ubah — dan memang benar semua itu bisa terjadi. Tetapi dengan urutan yang tepat, sebagian besar bahayanya bisa dicegah sebelum thread pertama dibuat: pekerjaan yang dibagi dengan benar, slot hasil yang milik sendiri-sendiri, dan kunci yang hanya dipasang di tempat yang benar-benar dibagi.
Tiga keputusan desain menjaga program ini tetap dapat diuji. Pertama, data uji dibuat oleh PRNG berseed tetap (std::mt19937 dengan seed 42), sehingga setiap eksekusi bekerja pada data yang identik. Kedua, pembagian pekerjaan berupa rentang kontigu yang bisa diverifikasi tanpa thread — tidak ada celah, tidak ada tumpang tindih. Ketiga, program memakai pola collect-then-merge: tiap thread menulis ke slot hasil miliknya sendiri, thread utama menggabungkannya setelah semua selesai, dan hanya satu variable statistik yang dipakai bersama sehingga hanya dia yang membutuhkan mutex. Hasil akhirnya: output program berupa nilai agregat yang sama persis di setiap eksekusi, walaupun urutan eksekusi thread tak pernah terkendali.
Kita membangunnya dalam empat bagian:
- Bagian 1: Membagi Pekerjaan — data uji yang deterministik dan pembagian 4.000.000 elemen ke rentang kerja tanpa celah.
- Bagian 2: Menjalankan Thread —
std::jthread, capture lambda yang aman, dan slot hasil per thread. - Bagian 3: Menyinkronkan Data — data race sebagai undefined behavior, lalu
std::mutexdanstd::lock_guardpada satu-satunya data bersama. - Bagian 4: Menguji Kebenaran dan Performa — program final, harness 29 cek yang membandingkan hasil paralel dengan single-thread, dan pembacaan pengukuran waktu.
Program final tersedia di src/multithread.cpp dan harnessnya di tests/uji-multithread.cpp sejak awal, sama seperti proyek-proyek sebelumnya. Anda tidak perlu pengalaman thread sebelumnya — semua keputusannya kita bangun dan kita buktikan langkah demi langkah.
Mulai proyek aplikasi multithreaded: menyiapkan data uji yang deterministik dan membagi 4.000.000 elemen ke empat rentang kerja tanpa celah dan tanpa tumpang tindih.
Buka → # Bagian 2: Menjalankan ThreadMembuat empat std::jthread dengan lambda, membagikan slot hasil agar bebas data race, dan menjalankan pola collect-then-merge yang membuat output tetap deterministik.
Buka → # Bagian 3: Menyinkronkan DataKapan data bersama butuh pelindung: data race sebagai undefined behavior, mutex dan lock_guard sebagai pasangan penjaga, serta desain yang membuat sebagian besar data tidak perlu dikunci.
Buka → # Bagian 4: Menguji Kebenaran dan PerformaTuntaskan proyek multithreaded: program final, harness 29 cek yang membuktikan hasil paralel identik dengan single-thread, dan cara membaca pengukuran waktu tanpa menjadikannya output terverifikasi.
Buka →