2016-06-11 8 views
1

私はプロデューサー/コンシューマーアプリケーションを作ろうとしています。問題は、私のプロデューサがバッファ全体を埋めることです。次に、消費者がバッファ全体を取り除いています...プロデューサがセマフォにpostを作ると、すぐにバッファからアイテムを削除するはずですか?プロデューサーとコンシューマー、Cのsempahoreで作業

マイコード:

void* producerFunc(void* arg) 
{ 
    while(n_insertions < N_PRODUCTS) 
    { 
     sem_wait(&sem_postAvaliable); 
     sem_wait(&mutex); 
     //Insert Item 
     sem_post(&mutex); 
     sem_post(&sem_posTaken); 
    } 
    pthread_exit(NULL); 
} 

void* consumerFunc(void* arg) 
{ 
    while(n_consumed < N_PRODUCTS) 
    { 
     sem_wait(&sem_posTaken); 
     sem_wait(&mutex); 
     //Remove from bufer 
     sem_post(&mutex); 
     sem_post(&sem_postAvaliable); 
    } 
    pthread_exit(NULL); 
} 

n_insertionsがバッファに挿入される項目の数をカウントするグローバル整数です。

n_consumedは、消費者がバッファからアイテムを消費した回数をカウントする大域整数です。

+2

これは、セマフォsem_postAvaliableとsem_posTakenをどのような値で初期化するのですか?また、 'pthread_mutex_t'を使ってmutexを宣言し、' pthread_mutex_lock'と 'pthread_mutex_unlock'を使ってそのmutexのロックを解除してロックすることができます。 – OiciTrap

+0

@cursillosonline sem_postAvaliableは、私のバッファのサイズである5に設定されています。 sem_posTakenはバッファのスペースがまだ取られていないため0で初期化されます。 pthread_mutex_lockで確認します(大きな違いはありますか) – PlayHardGoPro

答えて

3

非常に高いレベルで、sem_post(&sem_posTaken)を実行すると、消費者に「何かを消費することができます」と伝えられますが、その後プロセッサスケジューラによっては、セマフォのカウンタがそれらを許可しないので、プロデューサーが何かを挿入した直後、あるいは3つのインサートの後に消費者が消費する可能性があります。カウンタが0のセマフォのsem_waitを作成しようとするとスレッドがブロックされます。

sem_postAvaliableから1に初期化してみてください最初に、他のスレッドがブロックされてsem_post(&sem_postAvaliable)を待つので、あなたがバッファに挿入したものを消費する消費者は1人だけですが、この場合、1より大きなサイズのバッファは意味がありません。

+0

私のコードは正しいですか? OMG – PlayHardGoPro

+1

確かに、少なくとも私はコードのその部分に間違ったものは見当たりません。 – OiciTrap

+0

私はそれがバッファ全体を満たし、バッファ全体を一度に空にするという事実が、何かが間違っているという兆候であったということを私は思っています; Pありがとう – PlayHardGoPro

関連する問題