Чтобы узнать С++ 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.