要处理的线程

时间:2016-04-27 10:45:16

标签: c multithreading process

如何将此代码重写为使用进程而非线程?我尝试用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;
}

感谢任何帮助人员

1 个答案:

答案 0 :(得分:1)

要使用流程而不是线程,您需要使用pthread_create()的方法替换fork()次调用。

然后,父进程将继续本地继续pthread_create()之后的状态。

然后,孩子将调用传入的方法。

新创建的流程的pid将扮演tid

的角色

由于您似乎已经在使用posix信号量,因此这将继续有效。但是,您需要使用命名信号量(请参阅sem_open)并在子进程中使用它(在调用方法之前)以在您的进程之间共享信号量。