线程加入如何工作?

时间:2016-09-05 05:56:14

标签: c++ multithreading stdthread

我找到了一个基于线程工作的C ++ Web服务器example

我从

替换了line 161
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";

结果显然表明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 个答案:

答案 0 :(得分:2)

thread::join等待线程完成。

在您的第一个示例中,server_thread无限期地保持无论多少运行; join的目的是防止main方法过早返回(因为这会杀死服务器线程)。

在第二个示例中,线程只执行快速任务然后关闭,因此join会快速返回。