0
私の現在のコードはプロデューサのコンシューマの質問に答えていますが、別の方法で実装したいと思います。私はグローバル変数を使用してバッファスタックのカウントを追跡したくありません。私の思考プロセスは何ですか?グローバル変数を持たないスレッドでセマフォを実装する方法
typedef int semaphore;
semaphore mutex, full, empty;
int count = 0;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
int buffer[N];
これらは、カウント
int remove_item()
{
int ret = buffer[--count];
buffer[count] = 0;
return ret;
}
void insert_item(int item)
{
buffer[count++] = item;
}
int produce_item(){
int item = rand()%50 +1;
printf("Producer produces %d\n",item);
sleep(1);
return item;
}
そして、私の生産者、消費者の機能
void* consumer(void * arg) {
int item = 0;
while(1){
down(full);
down(mutex);
item = remove_item();
buffer[count++] = item;
up(mutex);
up(empty);
consume_item(item);
}
return 0;
}
void* producer(void* arg) {
int item, i =0;
while(1){
item = produce_item();
down(empty);
down(mutex);
insert_item(item);
up(mutex);
up(full);
sleep(1);
}
カウント、3つのセマフォ、およびバッファ領域は、すべて1つの 'PCqueue'構造体に属します。初期化されたもの(またはそのポインタ)を返す関数が必要です。構造体は、任意のスレッドのスタック上に簡単に持ち上げることができます。 – ThingyWotsit
投稿されたコードはどのセマフォも実装していません。結果として生じる「レース」条件は、壊れた、紛失した、重複したデータをもたらす。 – user3629249