Sobes.tech
Middle

İplər arasında qarşılıqlı əlaqəni necə sinxronlaşdırmaq olar?

sobes.tech Süni İntellekt

AI-dan cavab

C/C++-də qarşılıqlı əlaqə və sinxronizasiya üçün bir neçə əsas mexanizm mövcuddur:

  • Mutexlər (Mutual Exclusions): Paylaşılan resursa eksklüziv giriş təmin edir. Mutex-i ələ alan bir thread, onu buraxana qədər digər thread-lərin onu ələ keçirməsinə mane olur.

    #include <mutex>
    
    std::mutex my_mutex;
    
    void my_thread_function() {
        my_mutex.lock(); // Mutex-i ələ keçirmək
        // Paylaşılan resursla işləmək
        my_mutex.unlock(); // Mutex-i buraxmaq
    }
    

    Yaxud RAII ilə:

    #include <mutex>
    #include <lock_guard>
    
    std::mutex my_mutex;
    
    void my_thread_function() {
        std::lock_guard<std::mutex> lock(my_mutex); // Obraz yaradılarkən mutex-i ələ keçirmək
        // Resursla işləmək
        // Mutex avtomatik olaraq scope-dan çıxarkən buraxılır
    }
    
  • Semaforlar (Semaphores): Mutexlərin ümumiləşdirilməsi. Sayğac saxlayır və bu sayğacın dəyəri ilə eyni anda neçə thread-in resursa daxil ola biləcəyini müəyyən edir.

    #include <semaphore.h> // POSIX semaforlar üçün
    #include <windows.h> // Windows semaforlar üçün
    
    sem_t my_semaphore; // POSIX semaforu
    
    void my_thread_function() {
        sem_wait(&my_semaphore); // Sayğacı azaldır, 0 olarsa bloklayır
        // Resursla işləmək
        sem_post(&my_semaphore); // Sayğacı artırır
    }
    

    (Qeyd: C++ standartında semaforlar birbaşa daxil edilmir, lakin sistem kitabxanaları və ya üçüncü tərəf kitabxanaları vasitəsilə mövcuddur.)

  • Şərti dəyişənlər (Condition Variables): Bir thread-in müəyyən bir şərtin baş verməsini gözləməsinə imkan verir və bu zaman mutex-i sərbəst buraxır. Digər thread gözləyənə şərtin yerinə yetdiyini xəbərdar edə bilər.

    #include <mutex>
    #include <condition_variable>
    
    std::mutex my_mutex;
    std::condition_variable my_cv;
    bool condition_met = false;
    
    void waiting_thread() {
        std::unique_lock<std::mutex> lock(my_mutex);
        my_cv.wait(lock, []{ return condition_met; }); // Şərtin yerinə yetməsini gözləyir
        // Şərt yerinə yetdi, resursla işləmək
    }
    
    void notifying_thread() {
        std::unique_lock<std::mutex> lock(my_mutex);
        condition_met = true;
        lock.unlock(); // Bildiriş vermədən əvvəl mutex-i sərbəst buraxmaq (tövsiyə olunur)
        my_cv.notify_one(); // Bir gözləyən thread-i xəbərdar et
        // və ya
        // my_cv.notify_all(); // Bütün gözləyən thread-ləri xəbərdar et
    }
    
  • Atomar əməliyyatlar (Atomic Operations): Sadə əməliyyatları (məsələn, artım, azalma) bir bütün kimi yerinə yetirməyə imkan verir, və bu, açıq şəkildə mutex istifadə etmədən edilir.

    #include <atomic>
    
    std::atomic<int> counter(0);
    
    void my_thread_function() {
        counter++; // Atomik artım
        // və ya:
        // counter.fetch_add(1);
    }
    
  • Oxuma-Yazma Lock-ləri (Shared Mutexes): Bir neçə thread-in eyni zamanda məlumatları oxumasına, lakin yalnız birinin yazmasına imkan verir.

    #include <shared_mutex> // C++17 və yuxarı
    
    std::shared_mutex my_shared_mutex;
    
    void read_thread() {
        my_shared_mutex.lock_shared(); // Oxuma üçün lock
        // Məlumatların oxunması
        my_shared_mutex.unlock_shared(); // Oxuma üçün unlock
    }
    
    void write_thread() {
        my_shared_mutex.lock(); // Yazma üçün lock (exklüziv)
        // Məlumatların yazılması
        my_shared_mutex.unlock(); // Yazma üçün unlock
    }
    
  • Barierlər (Barriers): Bir qrup thread-in müəyyən bir nöqtəyə çatmasını gözləməsinə imkan verir və hamısı oraya çatdıqdan sonra davam edir.

    #include <barrier> // C++20
    
    std::barrier sync_point(4); // 4 thread üçün barrier
    
    void my_thread_function() {
        // Barrier-dən əvvəlki işlər
        sync_point.arrive_and_wait(); // Hamı barrier-ə çatana qədər gözləyir
        // Barrier-dən sonra işlər
    }
    

Seçim, qarşılıqlı əlaqənin və paylaşılan resursların xarakterinə görə asılıdır.