2016-04-27 3 views
-1

Wie kann ich diesen Code auf Prozess nicht Thread schreiben? Ich versuche Prozess-Programmierung in C Sprache zu lernen. Ich habe keine Ahnung, wie ich das machen kann. Dieser Code verwendet Thread. Mehr Informationen zu diesem algoritmus ist hier auf Seite 153-158:Thread zum Prozess

http://www.greenteapress.com/semaphores/downey08semaphores.pdf

#include <stdio.h> 
#include <stdlib.h> 
#include <semaphore.h> 
#include <pthread.h> 

#define MAX_PASSENGERS 500 

sem_t loading, loaded, unloading, unloaded; 

int n, c; 

void *passenger (void *tid) { 
    int i = *((int*) tid); 

    while (1) { 

    sem_wait(&loading); 
    printf("pass(i=%d).board()\n", i); 
    sem_post(&loaded); 

    sem_wait(&unloading); 
    printf("pass(i=%d).unboard()\n", i); 
    sem_post(&unloaded); 

    } 
} 

void *roller_coaster() { 
    while (1) { 

    printf("car.load(c=%d)\n", c); 
    for (int i = 0; i < c; i++) { 
     sem_post(&loading); 
    } 

    // wait for c passengers to load 
    for (int i = 0; i < c; i++) { 
     sem_wait(&loaded); 
    } 

    printf("car.run()\n"); 

    sleep(1); 

    printf("car.unload(c=%d)\n", c); 
    for (int i = 0; i < c; i++) { 
     sem_post(&unloading); 
    } 

    // wait for c passengers to unload 
    for (int i = 0; i < c; i++) { 
     sem_wait(&unloaded); 
    } 

    } 
} 

int main() { 

    printf("Number of passengers(n, n <= 500): "); 
    scanf("%d", &n); 
    printf("Number of passengers per cart(c, c < n): "); 
    scanf("%d", &c); 

    sem_init(&loading, 0, 0); 
    sem_init(&unloading, 0, 0); 

    sem_init(&loaded, 0, 0); 
    sem_init(&unloaded, 0, 0); 

    pthread_t car; 
    pthread_t tid[MAX_PASSENGERS]; 

    int my_ids[MAX_PASSENGERS]; 

    pthread_create(&car, NULL, roller_coaster, NULL); 

    for (int i = 0; i < n; i++) { 
    my_ids[i] = i; 
    pthread_create(&tid[i], NULL, passenger, &my_ids[i]); 
    } 

    pthread_join(car, NULL); 

    return 0; 
} 

Vielen Dank für all Hilfe Jungs

+0

Sie könnten jede Form von [IPC] (https://en.wikipedia.org/wiki/Inter-process_communication) verwenden, um Message-Passing zu implementieren, das ist ein guter Anfang. Sie können dies mit Sockets oder named/anonyme Pipes etc. tun. Lesen Sie den Link um loszulegen (; – Linuxxon

+0

) Sie könnten Ihren Code umstrukturieren und [fork] verwenden (http://linux.die.net/man/2/fork) a Child-Prozess und eine Pipe zwischen, um Daten zu senden/empfangen.Beachten Sie, dass Sie den Elternprozess in einer Art Schleife halten müssen, während die Kinder arbeiten. – alexJones

Antwort

1

Für Prozesse statt Threads verwenden, müssen Sie pthread_create() Anrufe mit einer Methode ersetzen das verwendet fork().

Der übergeordnete Prozess wird dann lokal mit dem fortfahren, was jetzt nach Ihrer pthread_create() s ist.

Das Kind wird dann rufen Sie die Methode übergeben werden.

Die pid der neu geschaffenen Prozesse wird die Rolle der tid nehmen.

Da Sie bereits Posix-Semaphoren zu verwenden scheinen, wird dies weiterhin funktionieren. Sie müssen jedoch benannte Semaphore verwenden (siehe sem_open) und diese auch in den untergeordneten Prozessen verwenden (bevor Sie Ihre Methoden aufrufen), um die Semaphore unter Ihren Prozessen zu teilen.