C++ 11(および追加機能)を学ぶには、boost asioおよびC++ 11(スレッドおよびラムダ用)を使用して簡単なhttpサーバーを作成しています。これは、セグメンテーションで終了し静的リンクを使用して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();
}
:
私は新しいC++ 11件のラムダとstd ::スレッドをテストしたいので、私はラムダでのstd ::スレッドでこのようなio_service.run()
を開始しようとしました失敗。さらに、ときにはラムダの中で拍子を実行していることもあります(endlはフラッシュする必要がありますが)。どちらの場合でも、正しいアドレスはio_service_
です。ただし、std::thread
をboost::thread
に置き換えた場合(他に変更はありません)、すべて正常に動作しています。
誰かが問題が発生したアイデア(asio、std :: threadまたはstd :: lambda)があれば感謝します。
追加情報:this
をキャプチャするとき、私はそれを行うようラムダ内のメンバーio_service_にアクセスする別のpostによると
は、罰金です。
私はgb 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削除するには、問題を修正しました。私は問題がブーストやラムダとは無関係であり、静的なものを構築し、std::thread
を使用するたびに再現できることを知りました。何らかの理由でこの組み合わせが機能しません。 私はこのpostがほぼ同じと説明していると思いますが、詳細は分かりませんが、エラーメッセージが異なります。
なぜstd::thread
とスタティックリンクが一緒に機能しないのだろうと思います。静的リンクが許可されていない理由はありますか?私は質問のタイトルを更新し、ブーストタグを削除しました。
私は上記のコードは現時点では何もしないことを知っています。私は記述された問題に関連するものだけを残しました... –
セグメンテーションフォールトがどこにあるかをデバッガで調べてみましたか? –
@JoachimPileborg申し訳ありませんが、それを逃した。 segfaultはラムダの最初の行(cout << ...)と2番目の行の他の時間(io_service_.run();)に時々ありました。最後に、boostやlambdaとは関係がないことがわかりましたが、スタティックなリンクとstd :: threadがあります。 -staticを削除すると問題が解決しました。私はそのような[問題](http://stackoverflow.com/questions/7090623/c0x-thread-static-linking-problem)を記述する同様の投稿を見つけました。 –