2016-07-19 27 views
0

Ich möchte einen Worker-Thread warten auf einen Befehl, tun Sie es, und senden Sie das Ergebnis zurück an den Aufrufer. Dies unterscheidet sich von dem normalen Producer/Consumer-Problem wegen der Antwort zurück.Wie kann ich einen Produzenten und einen Verbraucher in beide Richtungen kommunizieren lassen?

Das ist, was ich denke:

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 
} 

Bin ich auf dem richtigen Weg? Gibt es eine Chance, dass der Arbeiter antworten kann, bevor der Main anfängt zu warten?

(Ich verwende C++, wenn diese relevant ist)

+2

Sie haben einen Thread, der läuft, bis eine Bedingung erfüllt ist. Dann benachrichtigt es Thread 2 und hört auf zu laufen. Thread 2 wacht, läuft, erfüllt eine Bedingung, benachrichtigt Thread 1 und stoppt. Thread 1 wacht und läuft. Alle Arbeiten sind serialisiert. Sie haben die Notwendigkeit für Threading beseitigt und sind besser mit einer einzelnen Thread [State Machine] (https://en.wikipedia.org/wiki/Finite-state_machine). – user4581301

+0

@ user4581301 Mein Plan ist es, mehrere Arbeiter zu haben, damit ich die Arbeit parallel machen kann. (Ich habe den Beitrag aktualisiert) – Josh

+0

Wird von den Arbeitern jemals erwartet, dass sie neu gestartet werden, oder werden Sie bei Bedarf neue Threads erstellen? – user4581301

Antwort

2

Sie auf dem richtigen Weg sind, aber man kann die Dinge ein wenig vereinfachen und die Notwendigkeit zu beseitigen, um zu signalisieren, oder für das Signal warten

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 
} 

Je nachdem, wie Sie den freigegebenen Puffer partitionieren oder nicht partitionieren, müssen Sie ihn möglicherweise vor gleichzeitigem Schreiben schützen.