2012-01-25 7 views
10

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::threadboost::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とスタティックリンクが一緒に機能しないのだろうと思います。静的リンクが許可されていない理由はありますか?私は質問のタイトルを更新し、ブーストタグを削除しました。

+0

私は上記のコードは現時点では何もしないことを知っています。私は記述された問題に関連するものだけを残しました... –

+0

セグメンテーションフォールトがどこにあるかをデバッガで調べてみましたか? –

+1

@JoachimPileborg申し訳ありませんが、それを逃した。 segfaultはラムダの最初の行(cout << ...)と2番目の行の他の時間(io_service_.run();)に時々ありました。最後に、boostやlambdaとは関係がないことがわかりましたが、スタティックなリンクとstd :: threadがあります。 -staticを削除すると問題が解決しました。私はそのような[問題](http://stackoverflow.com/questions/7090623/c0x-thread-static-linking-problem)を記述する同様の投稿を見つけました。 –

答えて

6

-staticを削除すると問題が解決しました。私はブーストやラムダとは関係ないことを知りましたが、静的なリンクとstd::threadは未知の理由で一緒に働かないように見えました(これはpostも参照してください)。

なぜ彼らは一緒に働かないのかというと、興味深いですが、今のところ範囲外で、私は答えがうれしいので、回答としてマークすることができます。

6

-Wl,--whole-archive -lpthread -Wl,--no-whole-archive とアプリをリンクするhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590 これは私のために働きます。

+2

として投稿しています.gcc 6.2でも '-static -pthread'とリンクしただけでは、実行可能ファイル(実行時エラー)が壊れ、リンカエラーや警告さえありません。そして、gcc 4.7以降、この問題を発見するためにのみ数時間をデバッグする必要があり、 'RESOLVED INVALID'と解決されました。あなたの答えは、私が間違っていたことを最後に指摘しました。 – Julian

+1

あなたは命の恩人です。ありがとう! –

関連する問題