Для изучения 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
и статические ссылки некажется, работают вместе.Есть ли причина, по которой статические ссылки здесь не разрешены?Я обновил заголовок вопроса и удалил тег повышения.