2017-05-11 2 views
0

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); 

    } 
+0

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

+0

Der gepostete Code hat keine Semaphore implementiert. Die resultierenden "Rennbedingungen" führen zu beschädigten, verlorenen, duplizierten Daten. – user3629249

Antwort

1

Der übliche Weg ist es, die Variablen durch den Thread als Parameter verwendet wird passieren. Die meisten Thread-Bibliotheken (POSIX pthread, Windows CreateThread usw.) unterstützen dies, indem sie einem void-Zeiger auf jede Form von Daten erlauben, die beim Erzeugen an den Thread übergeben werden - dafür steht der "arg" -Parameter in Ihren Thread-Callback-Funktionen.

Verwandte Themen