Iniciar un std :: thread con enlace estático causa un error de segmentación
Para aprender c ++ 11 (y boost) estoy escribiendo un servidor http simple usando boost asio y c ++ 11 (para subprocesos y lambdas).
Quiero probar el nuevo c ++ 11 lambdas y std :: thread, así que intenté iniciar elio_service.run()
como esto en un std :: hilo con una 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();
}
Esto termina con una falla de segmentación. Además, a veces se ejecuta cout dentro de la lambda, a veces no (aunque endl debería enjuagarse). En cualquier caso, imprime la dirección correcta deio_service_
. Sin embargo, cuando reemplazo elstd::thread
con unboost::thread
(¡ningún otro cambio!), todo funciona bien.
Le agradecería si alguien tiene una idea de dónde está causado el problema (podría ser asio, std :: thread o std :: lambda).
Información Adicional
Según otraenvia acceder al miembro io_service_ dentro de una lambda está bien al capturarthis
, como lo hago.
Estoy ejecutando gcc 4.6.1 en Ubuntu y boost 1.46. Parámetros de 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
Actualizar
Removing -static solucionó el problema. Descubrí que el problema no tiene nada que ver con boost o lambdas y puede reproducirse cada vez que se crea estática y se usastd::thread
. Por alguna razón, esta combinación no funciona. Pienso estoenvia describe casi lo mismo, sin embargo, realmente no entiendo los detalles y el mensaje de error es diferente.
Así que me pregunto por quéstd::thread
y los enlaces estáticos no parecen funcionar juntos. ¿Hay alguna razón por la cual el enlace estático no está permitido aquí? Actualicé el título de la pregunta y eliminé la etiqueta de impulso.