Sobes.tech
Middle

როგორ შეიძლება სინქრონიზება მოხდეს ნაკადებს შორის ურთიერთქმედების?

sobes.tech AI

პასუხი AI-სგან

C/C++-да өз ара аракеттенүүнү синхрондоштуруу үчүн негизги механизмдердин бир нечеси бар:

  • Мьютекстер (Mutexes): Бөлүштүрүлгөн ресурска эксклюзивдүү кирүүгө камсыз кылат. Мьютекс алгандан кийин, башка потоктор аны алууга аракет кылганда, ал мьютекс бошотулгуча, блоктолот.

    #include <mutex>
    
    std::mutex my_mutex;
    
    void my_thread_function() {
        my_mutex.lock(); // Мьютексти алуу
        // Бөлүштүрүлгөн ресурстун иши
        my_mutex.unlock(); // Мьютексти бошотуу
    }
    

    RAII менен:

    #include <mutex>
    #include <lock_guard>
    
    std::mutex my_mutex;
    
    void my_thread_function() {
        std::lock_guard<std::mutex> lock(my_mutex); // Объект түзүлгөндө мьютекс алынып жатат
        // Бөлүштүрүлгөн ресурстун иши
        // Мьютекс автоматтык түрдө чыгарыла турган жерден бошотулат
    }
    
  • Семафорлор (Semaphores): Мьютекстердин кеңейиши. Счётчокту колдойт, ал белгилүү сандагы потокторго бир убакта ресурска кирүүгө мүмкүндүк берет.

    #include <semaphore.h> // POSIX семафорлору үчүн
    #include <windows.h> // Windows семафорлору үчүн
    
    sem_t my_semaphore; // POSIX семафор
    
    void my_thread_function() {
        sem_wait(&my_semaphore); // Семафордун эсептегичин азайтуу, 0 болсо токтоп калуу
        // Ресурс менен иштөө
        sem_post(&my_semaphore); // Семафордун эсептегичин көбөйтүү
    }
    

    (Эскертүү: Стандарт C++ семафорлорду түздөн-түз камтыбайт, бирок системдик китепканалар же үчүнчү жактын ишке ашырылышы аркылуу жеткиликтүү)

  • Шарттуу өзгөрмөлөр (Condition Variables): Токен белгилүү бир шарттын ишке ашуусун күтүүгө мүмкүндүк берет, ошол эле учурда мьютекс бошотулат. Башка поток күтүп жаткан шарт ишке ашканын билдире алат.

    #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; }); // Шарттын ишке ашуусун күтүү
        // Шарт ишке ашты, ресурспен иштөө
    }
    
    void notifying_thread() {
        std::unique_lock<std::mutex> lock(my_mutex);
        condition_met = true;
        lock.unlock(); // Шартты билдирүүдөн мурун мьютекс бошотуу (опционалдуу, бирок сунушталат)
        my_cv.notify_one(); // Бир күтүп жаткан потокту кабарлоо
        // же
        // my_cv.notify_all(); // Бардык күтүп жаткан потокторду кабарлоо
    }
    
  • Атомардык операциялар (Atomic Operations): Өзгөрмөлөр үстүндө жөнөкөй операцияларды (мисалы, инкремент, декремент) бирдиктүү, бөлүнбөс иш-аракет катары аткарууга мүмкүндүк берет, мьютекс түздөн-түз талап кылбайт.

    #include <atomic>
    
    std::atomic<int> counter(0);
    
    void my_thread_function() {
        counter++; // Атомардык инкремент
        // же:
        // counter.fetch_add(1);
    }
    
  • Окуу-жазуу локациялары (Shared Mutexes): Бир нече потокторго маалыматты бир убакта окууга мүмкүндүк берет, бирок жазуу үчүн бир гана поток уруксат алат.

    #include <shared_mutex> // C++17 жана андан жогору
    
    std::shared_mutex my_shared_mutex;
    
    void read_thread() {
        my_shared_mutex.lock_shared(); // Окууга алуу
        // Маалыматты окуу
        my_shared_mutex.unlock_shared(); // Бошотуу
    }
    
    void write_thread() {
        my_shared_mutex.lock(); // Жазуу үчүн алуу (эксклюзивдүү)
        // Маалыматты жазуу
        my_shared_mutex.unlock(); // Бошотуу
    }
    
  • Барьерлер (Barriers): Токендер тобу белгилүү бир чекке жеткенче күтүүгө мүмкүндүк берет, андан кийин гана улантат.

    #include <barrier> // C++20
    
    std::barrier sync_point(4); // 4 поток үчүн барьер
    
    void my_thread_function() {
        // Барьерге чейин иш
        sync_point.arrive_and_wait(); // Барьерге жеткенче күтүү
        // Барьерден кийин иш
    }
    

Конкреттүү механизмдин тандоосу өз ара аракеттенүүнүн табигатына жана бөлүштүрүлгөн ресурстарга көз каранды.