私は自分のクラスの一つでスケジューラーに取り組んでいます。基本的には、一度に実行できるスレッドは1つだけです。セマフォー・クラスを使用して、これらのスレッドがCPUを待っているスレッドをシミュレートするようにブロックすることができます。C++でバイナリセマフォークラスを実装する
問題は、間違ったタイミングでスレッドがブロックされ、間違ったタイミングで実行されているように見えることです。私は、セマフォの概念的な理解とそれを実装する方法が不足しているのだろうかと思っていました。私は私の実装についていくつかのフィードバックを得ることができるかどうか疑問に思っていた。インストラクターは、私がどのような方法で変更していない、このヘッダファイルを提供:
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();
};
これはPOSIXのものを使用して、私の実装です:あなたはmutexをロック無視されている
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);
}
}
"インストラクターはこのヘッダーファイルを提供しましたが、私はこれを変更しませんでした"。 – mfontanini
そうかもしれませんが、そのために私の答えを改変する必要はありません。事実、ここにバイナリセマフォーを持っておらず、正しく指摘していました。ヘッダーを変更することなくバイナリセマフォとして実装することが多分でしょう。それを行うことができます。 – Kaz
ありがとうございました。 – mfontanini