Запуск std :: thread со статическим связыванием вызывает ошибку сегментации - PullRequest
11 голосов
/ 25 января 2012

Для изучения c ++ 11 (и boost) я пишу простой http-сервер, использующий boost asio и c ++ 11 (для многопоточности и лямбды).

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

#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

Обновление:

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

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

Ответы [ 2 ]

8 голосов
/ 07 июля 2015

Свяжите ваше приложение с -Wl,--whole-archive -lpthread -Wl,--no-whole-archive Подробнее здесь https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590 Это работает для меня.

6 голосов
/ 26 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...