Sobes.tech
Middle

Жиптердин ортосунда өз ара аракеттенүүнү кантип синхрондоштурууга болот?

sobes.tech AI

AIден жооп

C++ тилинде бир нече негизги жиптерди синхрондоштуруу механизмдери бар:

  • Мьютекс (Mutexes): Өз ара чыгармачылык камсыздайт. Бир убакта гана бир жип мьютекске ээ боло алат. Жалпы ресурстарды бир убакта колдонуу алдын алууга колдонулат.

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

    #include <semaphore.h> // Көпчүлүк POSIX системдеринде колдонулат
    
    sem_t mySemaphore;
    
    void initSemaphore(int count) {
        sem_init(&mySemaphore, 0, count); // Семафорду count менен баштоо
    }
    
    void acquireResource() {
        sem_wait(&mySemaphore); // Эсептегичти азайтуу, 0 болсо токтоп калат
        // Ресурска колдонуу
    }
    
    void releaseResource() {
        sem_post(&mySemaphore); // Эсептегичти көбөйтүү
    }
    
  • Шарттуу өзгөрмөлөр (Condition Variables): Жиптер белгилүү бир шартта күтүүгө мүмкүндүк берет. Адатта мьютекс менен колдонулат. Күтүп жаткан жип шартты аткарганча мютекс бошотулат жана блоктолот, башка жип аны шарт аткарылганын билдиргенче.

    #include <condition_variable>
    #include <mutex>
    #include <queue>
    
    std::condition_variable myCondition;
    std::mutex myMutex;
    std::queue<int> myQueue;
    
    void producer(int value) {
        std::lock_guard<std::mutex> lock(myMutex);
        myQueue.push(value);
        myCondition.notify_one(); // Бир күтүп жаткан жипти кабарлоо
    }
    
    int consumer() {
        std::unique_lock<std::mutex> lock(myMutex);
        myCondition.wait(lock, [&]{ return !myQueue.empty(); }); // Шартты күтүү
        int value = myQueue.front();
        myQueue.pop();
        return value;
    }
    
  • Атомдук өзгөрмөлөр (Atomic Variables): Жөнөкөй операцияларды (окуу, жазуу, өзгөртүү) атомдук түрдө аткарууга мүмкүндүк берет, бул үчүн мьютекс колдонуу зарыл эмес.

    #include <atomic>
    
    std::atomic_int atomicCounter(0);
    
    void incrementCounter() {
        atomicCounter++; // Атомдук көбөйтүү
    }
    
  • Барьерлер (Barriers): Бир нече жиптерди синхрондоштурат, алардын эч бири уланта албайт, эгерде бардыгы барьерге жетпейинче.

    #include <barrier> // C++20
    
    std::barrier myBarrier(3); // 3 жип үчүн барьер
    
    void workerThread() {
        // Эмгектин бир бөлүгү
        myBarrier.arrive_and_wait(); // Бардык жиптер барьерде күтөт
        // Кийинки иш бөлүгү
    }
    

Конкреттүү механизмди тандоо жиптердин өз ара аракеттешүүсүнүн табиатына көз каранды:

  • Мьютекс (Mutex): Жалпысынан маалыматтарды коргоонун эң кеңири колдонулган жолу.
  • Семафор (Semaphore): Чектелген ресурстарга кирүүнү башкаруу.
  • Шарттуу өзгөрмөлөр (Condition Variables): Жиптин белгилүү бир окуя же абал келип чыгышын күтүүсү.
  • Атомдук өзгөрмөлөр (Atomic Variables): Жөнөкөй, атомдук операцияларды эффективдүү аткаруу.
  • Барьерлер (Barriers): Жиптерди келесі этапка биргелешип өтүү үчүн синхрондоштуруу.