Mise en œuvre d'un sémaphore binaire de la classe en C++

Donc, je suis en train de travailler sur un planificateur dans une de mes classes. Fondamentalement, nous sommes en prétendant qu'un seul thread peut s'exécuter en un temps. Nous sommes censés utiliser un sémaphore de la classe pour permettre à ces fils de bloquer eux-mêmes pour simuler le fil d'attente pour le CPU.

Le problème est, les fils semblent bloquer au mauvais moment et de l'exécuter au mauvais moment. Je me demandais si je suis absent de certaines compréhension conceptuelle d'un sémaphore et comment la mettre en œuvre. Je me demandais si je pouvais obtenir quelques commentaires sur mon œuvre. L'instructeur a fourni ce fichier d'en-tête que je n'ai pas modifié en aucune façon:

class Semaphore {
private:
  int             value;
  pthread_mutex_t m;
  pthread_cond_t  c;

public:

  /* -- CONSTRUCTOR/DESTRUCTOR */

  Semaphore(int _val);

  //~Semaphore();

  /* -- SEMAPHORE OPERATIONS */

  int P();
  int V();
};

C'est ma mise en œuvre à l'aide de posix trucs:

Semaphore::Semaphore(int _val){
    value = _val;
    c = PTHREAD_COND_INITIALIZER;
    m = PTHREAD_MUTEX_INITIALIZER;
}

int Semaphore::P(){
    if(value <= 0){
        pthread_cond_wait(&c, &m);
    }
    value--;
}

int Semaphore::V(){
    value++;
    if(value > 0){
        pthread_cond_signal(&c);
    }
}