2

こんにちは私は現在、io_serviceオブジェクトのスレッドプールを作成しようとしています。

これを行う方法の例も見つけました(例1fを参照してください:http ://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg = 2

その例も(もちろん)機能しますが、io_serviceを非グローバル(例にある)に維持しようと思います。だから今、私はio_serviceを引数としてワーカースレッドに渡して、それを「内部」に保つことを考えました。

boost :: thread_groupは(まだ)引数を渡すことをサポートしていないようですので、boost::bindでそれをやろうとしました

結果のコードは次のようになります。

void workerThread(io_service service)
{
    service.run();
}

void initListeners() //this function gets called in the main function
{   
    io_service io_service;
    //we give the io_service something to work here
    boost::thread_group worker_threads;

    for(int i = 0; i < 4; ++i)
        worker_threads.create_thread(boost::bind(workerThread, io_service));

    worker_threads.join_all();
}

しかし、私がこのコードをコンパイルしようとすると、彼は私にエラーを与えます

エラーC2248:'boost :: noncopyable _ :: noncopyable :: noncopyable':クラスで宣言されたプライベートメンバーにアクセスできません' boost :: noncopyable _ :: noncopyable '

この診断は、コンパイラによって生成された関数'boost :: asio :: io_service :: io_service(const boost :: asio :: io_service&)'で発生しました。

これは、io_serviceオブジェクトを引数として渡すことができないことを意味しますか?

はいの場合、io_serviceをグローバルオブジェクトとして使用せずにこのスレッドプールを実行するにはどうすればよいですか?
そうでない場合、この問題の解決策は上記のコードでどのようになりますか?

4

1 に答える 1

3

値ではなく参照で io_service を渡す必要があります。

io_service &service

引数としてと

boost::ref(io_service)

バインドするパラメーターとして。
有効期間が終了する前にすべてのスレッドに参加する必要があることに注意してください。そうしないio_serviceと、無効な参照が取得されます。

于 2012-05-19T11:37:20.523 に答える