2016-03-30 4 views
0

Ich habe einen Server, der auf einen Port hört, und ich erstelle mehrere getrennte Threads.C++ - Thread: Wie sende ich eine Nachricht an einen anderen Long-Live-Thread?

Nicht nur der Server selbst läuft für immer, sondern auch die getrennten Threads laufen für immer.

//pseudocode 
void t1_func() 
{ 
    for(;;) 
    { 
    if(notified from server) 
     dosomething(); 
    } 
} 
thread t1(t1_func); 
thread t2(...); 
for(;;) 
{ 
    // read from accepted socket 
    string msg = socket.read_some(...); 
    //notify thread 1 and thread 2; 
} 

Da ich Multithreading bin hier, ich weiß nicht, wie solche nofity in Server zu implementieren und check the nofity in freistehende Fäden.

Alle hilfreiche Tipps werden geschätzt.

+0

'std :: condition_variable'. –

Antwort

0

Der einfachste Weg, dies zu tun ist mit std::condition_variable. std::condition_variable wird warten, bis ein anderer Thread entweder notify_one oder darauf aufruft und erst dann wird es aufwachen.

Hier ist Ihr t1_func implementiert Bedingungsvariablen:

std::condition_variable t1_cond; 
void t1_func() 
{ 
    //wait requires a std::unique_lock 
    std::mutex mtx; 
    std::unique_lock<std::mutex> lock{ mtx }; 
    while(true) 
    { 
     t1_cond.wait(lock); 
     doSomething(); 
    } 
} 

Die wait Methode nimmt ein std::unique_lock aber die Sperre hat nicht den Faden zu benachrichtigen, gemeinsam genutzt werden. Wenn Sie das Arbeitsthread von dem Hauptthread aufwachen würden Sie notify_one oder notify_all wie folgt aufrufen:

t1_cond.notify_one(); 

Wenn Sie den Thread aufwachen nach einer gewissen Zeit haben wollen, könnten Sie wait_for anstelle von wait.

+0

Nach dem Aufruf 'notify', dem Worker' doSomething() ', kann der Worker-Thread immer noch auf die nächste Benachrichtigung warten? – chenzhongpu

+0

@ChenZhongPu Ja, jedes Mal, wenn es 'wait()' aufruft, wird es warten bis es benachrichtigt wird. – phantom

Verwandte Themen