Реализация трубы с использованием потоков в C - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь реализовать канал с функциями чтения, записи, закрытия. Мой основной создает 2 потока, один читает из массива и пишет в канал, а другой читает из канала и пишет в стандартный вывод. Я использую простой циклический буфер в качестве канала, и я использовал алгоритм Петерсона для синхронизации двух из них.

Мой основной должен ждать либо они завершат свою работу, либо получит вход "выход" из stdin, в которомВ случае, если он должен вызвать pipe_close () и прекратить 2 потока, заставив их вернуть

Как я могу получить ввод от stdin без блокировки? Как я могу заставить прекратить темы? Должен ли я использовать что-то вроде алгоритма Лампорта для синхронизации всех трех из них?

Примечание: я не могу использовать никакие функции из pthread.h, кроме create

void *myread(void *par) {
  //read char from array store in c
  write_to_pipe(c)
}

void *mywrite(void *par) {
  read_from_pipe(&c);
  //print to stdout
}

main() {
  //create threads
  //wait until theads return or "quit" is written in stdin, call pipe_close and cause threads to return
}

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Этот вопрос звучит как школьное задание. Если это так, вам следует обратиться к учителю за помощью.

Вы не можете получить ввод от stdin, не заблокировав поток, который читает из stdin . Что я хотел бы сделать, это установить два указателя для вашего кругового буфера. Один для потока stdin и один для потока stdout . После того, как stdin записал данные в буфер, он должен обновить свой указатель, чтобы он указывал на последний записанный элемент. stdout должен ждать, пока не увидит, что его указатель меньше, чем указатель stdin , и в этом случае он должен записать элементы буфера в stdout и обновлять свой собственный буфер после каждой записи.

Это в основном алгоритм Лампорта, но для двух потоков, одного производителя и одного потребителя.

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

Надеюсь, это поможет.

0 голосов
/ 20 октября 2019

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

...