La mise en œuvre de sémaphore par l'utilisation de mutex opérations primitives et

Il y a quelques temps, a eu une entrevue et a demandé de mettre en œuvre
Sémaphore par l'utilisation de mutex opérations primitives et seulement
(il permettait int pour être considérée comme atomique). Je suis venu avec la solution ci-dessous.
Il n'aimait pas occupé/wait - while (count >= size) {} -- et a demandé de mettre en œuvre le verrouillage de la place en utilisant plus primitive
les types et les mutex. Je n'ai pas réussi à venir avec une meilleure solution.
Des idées comment il pourrait être fait?

struct Semaphore {
int size;
atomic<int> count;
mutex updateMutex;

Semaphore(int n) : size(n) { count.store(0); }

void aquire() {
    while (1) {
        while (count >= size) {}
        updateMutex.lock();
        if (count >= size) {
            updateMutex.unlock();
            continue;
        }
        ++count;
        updateMutex.unlock();
        break;
    }
}

void release() {
    updateMutex.lock();
    if (count > 0) {
        --count;
    } //else log err
    updateMutex.unlock();
}
};
Utiliser une variable de condition de supprimer l'attente active. en.cppreference.com/w/cpp/thread/condition_variable Aussi, pourquoi n'utilisez-vous pas RAII à faire de verrouillage/déverrouillage.

OriginalL'auteur user2890398 | 2013-12-12