многопоточность - PullRequest
       19

многопоточность

2 голосов
/ 08 февраля 2011

Это вопрос дизайна.

У меня всего 6 потоков и две очереди FIFO.Шесть потоков:

  • 2 производителя производят «запись» (которая является беззнаковым целым) и ставят в очередь в очередь1
  • 2 полупотребителя, снимают запись с очереди1 и ставят в очередь2
  • 2 потребителя выписываются из очереди2

Общее количество записей составляет 500.

Мой вопрос: как я могу поддержать этих 2 полупотребителей и потребителей, пока все 500записи маршрутизируются через очередь 1 в очередь 2 и удаляются из очереди?Для потоков производителей это легко, потому что я могу поддерживать общее количество записей.

Так что, если total_entries = 500, вернитесь из подпрограммы (приводит к потере потоков).Я хочу использовать эффективный способ вместо какого-то взлома.

Среда: Linux, pthread, C / C ++.

1 Ответ

3 голосов
/ 08 февраля 2011

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

Для вашей конкретной задачи вы можете добавить понятие EOF к вашим FIFO, чтобы читатель мог различить «ничего не доступно сейчас» и «ничего не доступно никогда». Это может быть как простое значение (возможно, 0 не является допустимым значением для ваших потоков и может представлять это).

Затем ваш производитель «закрывает» свой конец FIFO, а когда он становится пустым, полупотребители видят EOF и закрывают свой конец следующего FIFO. Точно так же, как с реальными файлами, вам понадобится подсчет ссылок, чтобы знать, когда оба производителя были сделаны или когда оба полупотребителя были сделаны.

...