Mein aktueller Code beantwortet die Frage des Producer Consumer, aber ich möchte es auf eine andere Weise implementieren. Ich möchte keine globale Variable verwenden, um die Anzahl in meinem Pufferstapel zu verfolgen. Was sollte mein Denkprozess sein?So implementieren Sie Semaphore mit Threads ohne globale Variablen
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];
Dies sind die Funktionen, die
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;
}
count Und mein Produzent Verbraucher Funktionen
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);
}
Die Zählung, die drei Semaphoren und der Pufferraum gehören alle in eine "PCqueue" -Struktur. Sie benötigen eine Funktion, um eine initialisierte (oder einen Zeiger darauf) zurückzugeben. Die Struktur kann dann leicht auf dem Stapel eines beliebigen Threads erhöht werden. – ThingyWotsit
Der gepostete Code hat keine Semaphore implementiert. Die resultierenden "Rennbedingungen" führen zu beschädigten, verlorenen, duplizierten Daten. – user3629249