gpt4 book ai didi

c++ - 线程联接如何工作?

转载 作者:行者123 更新时间:2023-12-02 10:08:44 28 4
gpt4 key购买 nike

我发现了一个基于线程工作的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

最佳答案

thread::join等待直到线程完成。

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

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

关于c++ - 线程联接如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39324636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com