我找到了一个基于线程工作的C ++ Web服务器example。
我从
替换了line 161server_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
答案 0 :(得分:2)
thread::join
等待线程完成。
在您的第一个示例中,server_thread
无限期地保持无论多少运行; join
的目的是防止main
方法过早返回(因为这会杀死服务器线程)。
在第二个示例中,线程只执行快速任务然后关闭,因此join
会快速返回。