Zoeken…


Invoering

Semaphores zijn vanaf nu niet beschikbaar in C ++, maar kunnen eenvoudig worden geïmplementeerd met een mutex en een voorwaardelijke variabele.

Dit voorbeeld is afkomstig van:

C ++ 0x heeft geen semaforen? Hoe threads te synchroniseren?

Semafoor C ++ 11

#include <mutex>
#include <condition_variable>
        
class Semaphore {
public:
    Semaphore (int count_ = 0)
    : count(count_) 
    {
    }
    
    inline void notify( int tid ) {
        std::unique_lock<std::mutex> lock(mtx);
        count++;
        cout << "thread " << tid <<  " notify" << endl;
        //notify the waiting thread
        cv.notify_one();
    }
    inline void wait( int tid ) {
        std::unique_lock<std::mutex> lock(mtx);
        while(count == 0) {
            cout << "thread " << tid << " wait" << endl;
            //wait on the mutex until notify is called
            cv.wait(lock);
            cout << "thread " << tid << " run" << endl;
        }
        count--;
    }
private:
    std::mutex mtx;
    std::condition_variable cv;
    int count;
};

Semafoor klasse in actie

De volgende functie voegt vier threads toe. Drie threads strijden om de semafoor, die is ingesteld op een telling van één. Een langzamere thread roept notify_one() , waardoor een van de wachtende threads kan doorgaan.

Het resultaat is dat s1 onmiddellijk begint te draaien, waardoor de Semaphore's gebruik count hieronder 1. blijven de andere threads wachten op zijn beurt op de voorwaarde variabele tot de hoogte () wordt aangeroepen.

int main()
{
    Semaphore sem(1);
    
    thread s1([&]() {
        while(true) {
            this_thread::sleep_for(std::chrono::seconds(5));
            sem.wait( 1 );
        }           
    });
    thread s2([&]() {
        while(true){
            sem.wait( 2 );
        }
    });
    thread s3([&]() {
        while(true) {
            this_thread::sleep_for(std::chrono::milliseconds(600));
            sem.wait( 3 );
        }
    });
    thread s4([&]() {
        while(true) {
            this_thread::sleep_for(std::chrono::seconds(5));
            sem.notify( 4 );
        }
    });
    
    
    s1.join();
    s2.join();
    s3.join();
    s4.join();

    ...
    }


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow