2016-09-05 13 views
0

スレッドに基づいて動作するC++ Webサーバーexampleが見つかりました。私はスレッド結合はどのように機能しますか?

server_thread.join(); 

std::cout<<"Before thread join\n"; 

server_thread.join(); 

std::cout<<"5 sec delay starting ...\n"; 
this_thread::sleep_for(chrono::seconds(5)); 
std::cout<<"5 sec delay ended\n"; 

の結果からline 161置き換え

は明らかjoin後のコードが実行されていないことを示しています。

123 
{"firstName": "John","lastName": "Smith","age": 25} 
John Smith 
Before thread join 

以下の簡単な例では、thread_2.join();というコードも実行されますが、両スレッドが解放されるまでは、最終的には実行されません。std::cout.join();のロジックは何ですか現在のスレッドを一時停止しますか?

server_thread.join();がサーバーと並行して実行された後でコードを欲しい場合は、適切な解決策は何ですか?

main.cppに

#include <boost/thread.hpp> 
#include <iostream> 
#include <thread> 

void task1() { 
    // do stuff 
    for(int i=0;i<10;i++) 
    { 
     std::cout<<"task1 "<<"["<<i<<"]\n"; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
    } 
} 

void task2() 
{ 
    for(int i=0;i<10;i++) 
    { 
     std::cout<<"task2 "<<"["<<i<<"]\n"; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
    } 
} 

int main() 
{ 
    using namespace boost; 
    std::thread thread_1 = std::thread(task1); 
    std::thread thread_2 = std::thread(task2); 

    // do other stuff 
    thread_2.join(); 
    thread_1.join(); 
    // std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout<<"end of main function\n"; 
    return 0; 
} 

結果:

task1 [0] 
task2 [0] 
task1 [1] 
task2 [1] 
task1 [2] 
task2 [2] 
task1 [task2 [33] 
] 
task2 [4] 
task1 [4] 
task2 [5] 
task1 [5] 
task2 task1 [[66] 
] 
task2 [task1 [77] 
] 
task2 task1 [[88] 
] 
task2 [9] 
task1 [9] 
end of main function 
+1

http://en.cppreference.com/w/cpp/thread/thread/join –

+0

@JanHudec、なぜ私の 'main.cpp'ではスレッドがブロックされていないのですか? – ar2015

+0

@TheodorosChatzigiannakis、最初の例では現在のスレッドがどのように結合されていますか?現在のスレッドと同じ 'server_thread'ですか? – ar2015

答えて

2

thread::join待機スレッドが完了するまで。

最初の例では、server_threadは無限に実行され続けます。 joinの目的は、mainメソッドが途中で返されないようにすることです(これはサーバースレッドを強制終了させるためです)。

2番目の例では、スレッドはクイックタスクを実行して終了するため、joinはすぐに戻ります。

+0

私は混乱しました。私の2番目の例では、結果によると、両方のスレッドが同時に動作していて、 'task1'が終了した後に' task2'が実行されるようなものではありません。 – ar2015

+0

@ ar2015:両方のスレッドを開始し、両方のスレッドが完了するのを待つので、そうです。あなたが 'task1'が' task2'を起動する前に完了するのを待つように変更した場合、または 'task2'自体が' task1'が完了するのを待ってそれが完了するのを待っていたら、あなたは見えませんこのインターリービング。 – ruakh

+0

私は大きな間違いをしました。スレッドが 'join'するとスレッドが実行を開始すると仮定しました。あなたがあなたの答えを取り除くと、その質問を取り除くことができます。 – ar2015

関連する問題