2016-04-27 2 views
-1

Как я могу переписать этот код для использования процесса, а не потока? Я пытаюсь изучить процесс программирования на языке C. Я не знаю, как это сделать. Этот код использует поток. Более подробную информацию об этом algoritmus здесь на странице 153 - 158:Резьба к процессу

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

Спасибо за любую помощь, ребята

+0

Чтобы реализовать передачу сообщений, вы можете использовать любую форму [IPC] (https://en.wikipedia.org/wiki/Inter-process_communication), это хороший старт. Вы можете сделать это с помощью сокетов или именных/анонимных каналов и т. Д. Прочтите ссылку для начала работы (; – Linuxxon

+0

Вы можете перестроить свой код и использовать [fork] (http://linux.die.net/man/2/fork) a дочерний процесс и канал между отправкой/получением данных. Имейте в виду, что вам нужно будет поддерживать родительский процесс в каком-то цикле, пока дети работают. – alexJones

ответ

1

Для использования процессов вместо потоков вам нужно будет заменить pthread_create() вызовы с помощью метода который использует fork().

Родительский процесс затем продолжит локально с того, что теперь после вашего pthread_create().

Ребенок будет вызывать метод передается в.

pid вновь созданных процессов будет взять на себя роль tid.

Как вы уже, кажется, используете семафоры posix, это будет продолжать работать. Однако вам нужно будет использовать именованные семафоры (см. sem_open) и использовать это также в дочерних процессах (перед вызовом методов) для обмена семафорами среди ваших процессов.

Смежные вопросы