Запуск std :: thread со статическим связыванием вызывает ошибку сегментации
Для изучения c ++ 11 (и boost) я пишу простой http-сервер, использующий boost asio и c ++ 11 (для потоков и лямбд).
Я хочу протестировать новые лямбды c ++ 11 и 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 и может быть воспроизведена при сборке и использовании staticstd::thread
, По любой причине эта комбинация не работает. я думаю, что этоПочта описывает почти то же самое, однако я не очень понимаю детали и сообщение об ошибке другое.
Так что мне интересно, почемуstd::thread
и статические ссылки не работают вместе. Есть ли причина, по которой статические ссылки здесь не разрешены? Я обновил заголовок вопроса и удалил тег повышения.