используя UNIX Pipeline с C - PullRequest
       4

используя UNIX Pipeline с C

0 голосов
/ 14 октября 2010

Мне необходимо создать 6 потоков для одновременного выполнения задачи (увеличения / уменьшения числа) до тех пор, пока целое число не станет равным 0. Предполагается, что я использую только команды UNIX (конвейеры, чтобы быть конкретными), и я не могу получить свой Обдумайте, как работают конвейеры или как я могу реализовать эту программу.

Это целое число может быть сохранено в текстовом файле.

Буду очень признателен, если кто-нибудь сможет объяснить, как реализовать эту программу

1 Ответ

1 голос
/ 14 октября 2010

Книга верна, трубы можно использовать для защиты критических секций, хотя как это сделать не очевидно.

int *make_pipe_semaphore(int initial_count)
{
   int *ptr = malloc(2 * sizeof(int));
   if (pipe(ptr)) {
       free(ptr);
       return NULL;
   }
   while (initial_count--) 
       pipe_release(ptr);
   return ptr;
}

void free_pipe_semaphore(int *sem)
{
    close(sem[0]);
    close(sem[1]);
    free(sem);
}

void pipe_wait(int *sem)
{
    char x;
    read(sem[0], &x, 1);
}

void pipe_release(int *sem)
{
   char x;
    write(sem[1], &x, 1);
}

Максимальное количество свободных ресурсов в семафоре варьируется от ОС к ОС, но обычно составляет не менее 4096. Это не имеет значения для защиты критической секции, где начальное и максимальное значения равны 1.

Использование:

/* Initialization section */
int *sem = make_pipe_semaphore(1);



/* critical worker */
{
    pipe_wait(sem);
    /* do work */

    /* end critical section */
    pipe_release(sem);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...