Suche…
Einführung
Semaphore sind derzeit nicht in C ++ verfügbar, können jedoch leicht mit einem Mutex und einer Bedingungsvariablen implementiert werden.
Dieses Beispiel wurde entnommen aus:
C ++ 0x hat keine Semaphore? Wie synchronisiere ich Threads?
Semaphor 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;
};
Semaphore-Klasse in Aktion
Die folgende Funktion fügt vier Threads hinzu. Drei Threads konkurrieren um das Semaphor, das auf eine Anzahl von Eins gesetzt ist. Ein langsamerer Thread ruft notify_one()
, damit einer der wartenden Threads fortfahren kann.
Das Ergebnis ist , dass s1
sofort beginnt sich zu drehen, wodurch die Nutzung des Semaphore count
unter 1. Die anderen Fäden wiederum von der Bedingungsvariable warten zu bleiben , bis benachrichtigen () aufgerufen wird.
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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow