2016-07-19 4 views
0

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

Это то, что я имею в виду:

main 
{ 
construct workers 
push to shared input buffers 
notify workers 
wait 
print results from shared output buffer 
} 

worker 
{ 
wait 
read from shared input buffer 
do work 
notify main 
} 

Я на правильном пути? Есть ли шанс, что работник может ответить до того, как начнутся главные запуски?

(я использую C++, если это уместно)

+2

У вас есть поток, который работает до тех пор, пока не будет выполнено условие. Затем он уведомляет поток 2 и останавливается. Thread 2 просыпается, работает, удовлетворяет условию, уведомляет поток 1 и останавливается. Тема 1 просыпается и бежит. Вся работа сериализована. Вы устранили необходимость в нарезке резьбы, и лучше с помощью однопоточного [конечного автомата] (https://en.wikipedia.org/wiki/Finite-state_machine). – user4581301

+0

@ user4581301 Мой план состоит в том, чтобы иметь нескольких работников, чтобы я мог выполнять работу параллельно. (Я обновил сообщение) – Josh

+0

Ожидаются ли перезагрузки рабочие или при необходимости создадут новые потоки? – user4581301

ответ

2

Вы на правильном пути, но вы можете упростить вещи немного и устранить необходимость сигнализировать или ждать сигнала

main 
{ 
    push to shared input buffers 
    construct workers // create and immediately run. No need for signal 
    while more workers 
     join worker // will block until worker thread exits 
    print results from shared output buffer 
} 

worker 
{ 
    read from shared input buffer 
    do work 
} 

В зависимости от того, как вы разделяете общий буфер или не разбиваете на разделы, вам может потребоваться защитить его от одновременной записи.

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

  • Нет связанных вопросов^_^