#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
 
// Deklarasi variabel hitung atomik
std::atomic<int> counter(0);
 
// Fungsi yang akan dijalankan oleh setiap thread
void increment() {
    for (int i = 0; i < 10000; ++i) {
        counter++; // Operasi atomik
    }
}
 
int main() {
    const int num_threads = 10;
    std::vector<std::thread> threads;
 
    // Membuat dan menjalankan thread
    for (int i = 0; i < num_threads; ++i) {
        threads.push_back(std::thread(increment));
    }
 
    // Menunggu semua thread selesai
    for (int i = 0; i < num_threads; ++i) {
        threads[i].join();
    }
 
    // Menampilkan hasil akhir
    std::cout << "Hasil akhir hitungan atomik: " << counter.load() << std::endl; // Membaca nilai atomik
 
    return 0;
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXRvbWljPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8dmVjdG9yPgoKLy8gRGVrbGFyYXNpIHZhcmlhYmVsIGhpdHVuZyBhdG9taWsKc3RkOjphdG9taWM8aW50PiBjb3VudGVyKDApOwoKLy8gRnVuZ3NpIHlhbmcgYWthbiBkaWphbGFua2FuIG9sZWggc2V0aWFwIHRocmVhZAp2b2lkIGluY3JlbWVudCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgewogICAgICAgIGNvdW50ZXIrKzsgLy8gT3BlcmFzaSBhdG9taWsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBjb25zdCBpbnQgbnVtX3RocmVhZHMgPSAxMDsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB0aHJlYWRzOwoKICAgIC8vIE1lbWJ1YXQgZGFuIG1lbmphbGFua2FuIHRocmVhZAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgKytpKSB7CiAgICAgICAgdGhyZWFkcy5wdXNoX2JhY2soc3RkOjp0aHJlYWQoaW5jcmVtZW50KSk7CiAgICB9CgogICAgLy8gTWVudW5nZ3Ugc2VtdWEgdGhyZWFkIHNlbGVzYWkKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7ICsraSkgewogICAgICAgIHRocmVhZHNbaV0uam9pbigpOwogICAgfQoKICAgIC8vIE1lbmFtcGlsa2FuIGhhc2lsIGFraGlyCiAgICBzdGQ6OmNvdXQgPDwgIkhhc2lsIGFraGlyIGhpdHVuZ2FuIGF0b21pazogIiA8PCBjb3VudGVyLmxvYWQoKSA8PCBzdGQ6OmVuZGw7IC8vIE1lbWJhY2EgbmlsYWkgYXRvbWlrCgogICAgcmV0dXJuIDA7Cn0K