2013-05-05 3 views
3

Что касается потоков, у меня есть мьютекс и условные обозначения, чтобы я мог легко манипулировать ими.
Однако, если я создаю два процесса на fork(), как я могу заставить их чередовать?
Или, есть ли способ создать «критический раздел» для процессов?Как сделать процессы чередующимися?

Я намеревался сделать программу, которая печатает «r» и «w» в качестве альтернативы, вот код.

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

int pipe_1[2]; 
int flag = 0; 

void r(); 
void w(); 

int main() { 
    pipe(pipe_1); 

    if(fork()) 
     r(); 
    else 
     w(); 
} 

void r() { 
    int count = 0; 
    while(1) { 
     printf("%d \n", flag); 
     if (count == 10) 
      exit(0); 
     if(flag == 0) { 
      puts("r"); 
      flag = 1; 
      count++; 
      while(flag == 1) 
       ; 
     } 
    } 
} 

void w() { 
    while(1) { 
     if(flag == 1) { 
      puts("w"); 
      flag = 0; 
      while(flag == 0) 
       ; 
     } 
    } 
} 

из положить только:

0 
r 

Тогда кажется, ввести бесконечный цикл.
В чем проблема?
И какой правильный способ сделать чередующиеся процессы?

Спасибо.

+0

Я надеюсь, что вы будете делать это как упражнение и * do * знать, что ОС позаботится о блокировании процессов, когда труба будет заполнена или пуста по мере необходимости, да? – dmckee

+0

Nope.Это действительно упражнение, но мой профессор никогда не читает лекции о способе работы ОС в отношении процессов, связанных с различными ситуациями в трубах. – octref

ответ

1

Это может быть подавляющее, но есть ТОНЫ примитивов, которые вы могли бы использовать. См. Здесь список.

http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html

Взглянув на список, почти все из тех, кто мог бы быть использован. Некоторые из них больше похожи на традиционные примитивы синхронизации pthread, другие - на более высоком уровне, но все еще могут использоваться для синхронизации.

Например, вы можете просто открыть TCP-сокет между ними и отправить сообщения, когда очередь другой стороны. Может быть, с увеличивающимся числом.

Что-то, возможно, более традиционные было бы семафоры:

http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#semaphores

Кроме того, это предполагает, что современный Unix-подобную платформу. Windows, вероятно, очень отличается.

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

+0

Спасибо за ресурс! Я попытаюсь сделать это сначала, используя трубы. – octref

1

Это отдельные процессы, поэтому каждый имеет свой собственный флаг; r изменение его не влияет на w.

+0

Я этого не знал! Вот почему. Ох, поэтому мне нужна труба. – octref

+0

Да, это одно из самых больших различий между потоками и процессами - потоки разделяют пространство памяти, процессы имеют свои собственные (по крайней мере логически) – xaxxon

1

Для того, чтобы два процесса взаимодействовали друг с другом, не используя одно и то же адресное пространство (например, потоки), они должны использовать средства межпроцессного обмена (также IPC). Некоторые из механизмов IPC: разделяемая память, семафор, каналы, сокеты, очереди сообщений и многое другое. В большинстве случаев механизмы МПК являются специфичными для операционной системы. Тем не менее, многие идеи достаточно общие, поэтому можно придумать портативные реализации, которые проект Boost сделал в составе библиотеки Boost.Interprocess. Я думаю, что вы должны сначала взглянуть на раздел Synchronization Mechanisms. Обратите внимание, однако, что это библиотека C++. Я не знаю ни одной библиотеки C, которая так же хороша, как Boost.

Надеюсь, это поможет. Удачи!

+1

Boost - только C++, я считаю. Это может не иметь отношения к рассматриваемому вопросу. – xaxxon

+0

Это помогает. Спасибо! – octref

+0

@xaxxon: Хорошая точка, я как-то пропустил языковой тег: -] – 2013-05-05 01:06:35

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