私はプロデューサー/コンシューマーアプリケーションを作ろうとしています。問題は、私のプロデューサがバッファ全体を埋めることです。次に、消費者がバッファ全体を取り除いています...プロデューサがセマフォに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
は、消費者がバッファからアイテムを消費した回数をカウントする大域整数です。
これは、セマフォsem_postAvaliableとsem_posTakenをどのような値で初期化するのですか?また、 'pthread_mutex_t'を使ってmutexを宣言し、' pthread_mutex_lock'と 'pthread_mutex_unlock'を使ってそのmutexのロックを解除してロックすることができます。 – OiciTrap
@cursillosonline sem_postAvaliableは、私のバッファのサイズである5に設定されています。 sem_posTakenはバッファのスペースがまだ取られていないため0で初期化されます。 pthread_mutex_lockで確認します(大きな違いはありますか) – PlayHardGoPro