Подтвердить что ты не робот

Запуск std:: thread со статической связью вызывает ошибку сегментации

Чтобы узнать С++ 11 (и повысить), я пишу простой http-сервер, используя boost asio и С++ 11 (для потоковой передачи и lambdas).

Я хочу протестировать новые С++ 11 lambdas и std:: thread, поэтому я попытался запустить io_service.run(), как это, в std:: thread с lambda:

#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();
}

Это завершается ошибкой сегментации. Кроме того, иногда он запускает cout внутри лямбды, иногда нет (хотя endl должен скрываться). В любом случае, он печатает правильный адрес io_service_. Однако, когда я заменяю std::thread на boost::thread (никакое другое изменение!), Все работает нормально.

Я был бы признателен, если у кого-нибудь есть идея, где проблема вызвана (может быть asio, std:: thread или std:: lambda).

Дополнительная информация:

В соответствии с другим сообщением доступ к члену io_service_ внутри лямбда хорош при захвате this, как я это делаю.

Я запускаю gcc 4.6.1 на Ubuntu и повышаю 1.46. Параметры 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

Update:

Удаление -статического исправления проблемы. Я узнал, что проблема не имеет ничего общего с boost или lambdas и может быть воспроизведена при построении статичности и использовании std::thread. По какой-либо причине эта комбинация не работает. Я думаю, что этот пост описывает почти то же самое, однако я не очень понимаю детали, и сообщение об ошибке отличается.

Поэтому мне интересно, почему std::thread и статическая связь не работают вместе. Есть ли причина, почему статическая связь здесь не разрешена? Я обновил заголовок вопроса и удалил тег boost.

4b9b3361

Ответ 1

Снятие-статика решила проблему. Я узнал, что это не имеет ничего общего с boost или lambdas, но со статической связью и std::thread, которые, похоже, не работают вместе по какой-либо неизвестной причине (см. Также эту почту, которые могут быть связаны).

Я предполагаю, что вопрос, почему они не работают вместе, - хотя и интересный - пока что недоступен, и я доволен ответом, поэтому это можно отметить как ответ.