gpt4 book ai didi

c++ - 使用静态链接启动 std::thread 会导致段错误

转载 作者:可可西里 更新时间:2023-11-01 15:09:19 28 4
gpt4 key购买 nike

为了学习 c++11(和 boost),我正在使用 boost asio 和 c++11(用于线程和 lambda)编写一个简单的 http 服务器。

我想测试新的 c++11 lambda 和 std::thread,所以我尝试在带有 lambda 的 std::thread 中像这样启动 io_service.run():

#include <iostream>
#include <thread>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
using std::cout;
using std::endl;
using boost::asio::ip::tcp;

class HttpServer
{
public:
HttpServer(std::size_t thread_pool_size)
: io_service_(),
endpoint_(boost::asio::ip::tcp::v4(), 8000),
acceptor_(io_service_, endpoint_)
{ }

void Start() {
acceptor_.listen();
cout << "Adr before " << &io_service_ << endl;
std::thread io_thread([this](){
cout << "Adr inside " << &io_service_ << endl;
io_service_.run();
});
io_thread.join();
}

private:
boost::asio::io_service io_service_;
tcp::endpoint endpoint_;
tcp::acceptor acceptor_;
};

int main() {
HttpServer server(2);
server.Start();
}

这以段错误终止。此外,有时它会在 lambda 内部运行 cout,有时不会(尽管 endl 应该刷新)。在任何情况下,它都会打印出 io_service_ 的正确地址。但是,当我将 std::thread 替换为 boost::thread(没有其他更改!)时,一切正常。

如果有人知道问题出在哪里(可能是 asio、std::thread 或 std::lambda),我将不胜感激。

附加信息:

根据另一个post在捕获 this 时,访问 lambda 中的成员 io_service_ 没问题,正如我所做的那样。

我在 Ubuntu 和 boost 1.46 上运行 gcc 4.6.1。 G++ 参数:

g++ -std=c++0x -static -I/home/andre/DEV/boost_1_48_0/include/ -L/home/andre/DEV/boost_1_48_0/lib/ -o webserver main.cpp -lboost_system -lboost_thread -lpthread

更新:

删除 -static 解决了这个问题。我发现问题与 boost 或 lambda 无关,并且可以在构建静态和使用 std::thread 时重现。由于任何原因,这种组合不起作用。我觉得这个post描述几乎相同,但是我不太了解细节并且错误消息不同。

所以我想知道为什么 std::thread 和静态链接似乎不能一起工作。这里不允许静态链接是有原因的吗?我更新了问题标题并删除了 boost 标签。

最佳答案

将您的应用与 -Wl,--whole-archive -lpthread -Wl,--no-whole-archive 链接更多信息 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590它对我有用。

关于c++ - 使用静态链接启动 std::thread 会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9002264/

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