3

わかりました.. まず第一に、私はそのソースで BOOST を使用していると言わなければなりません (私はそうしなければなりません)。私は BOOST と C++ の両方の初心者ですが、コーディングは初めてではありません (マネージ言語には慣れています)。私はやや大規模なプロジェクトでこの問題に遭遇し、ここに提示しているこの小さなコード スニペットでそれを再現しました。

#include <boost/thread.hpp>

void foo(int bar) {
    printf("Chu %d!",bar);
}

int main() {
    boost::thread_attributes attrs;

    boost::thread causeTrouble(attrs,foo,42); // <-- Probably problematic line
    causeTrouble.join();
}

BOOST 1.52.0 のドキュメントによると、このスニペットは正常にコンパイルおよび実行されるはずです。ただし、BOOST ライブラリ ヘッダー ファイルで奇妙なコンパイルの問題が発生します (他のエラーや警告はありません)。

<boost_path>/bind/bind.hpp:313: error: no match for call to '(boost::thread_attributes) (void (*&)(int), int&)

以前にリンクされたドキュメントによると、実際のboost::thread(boost::thread_attributes,F f) コンストラクターがないように見えます。とにかく、面白いのは、次の両方の行が正常にコンパイルされることです。

boost::thread noTrouble(attrs,foo);

boost::thread noTroubleEither(foo,42);

StackOverflow やその他のインターネットを徹底的に検索したとしても、頭をどこに向けたらよいかわかりません :( 実は、実際に新しい質問をすることを余儀なくされたのはこれが初めてです. 助けて!

4

5 に答える 5

4

あなたは言う、

実際のboost::thread(boost::thread_attributes,F f)はないようです

ただし、それはあなたが呼び出そうとしているコンストラクターではありません。を呼び出していますboost::thread(attrs, foo, 42)。リンクに基づいて、コンストラクターが実装されていないように見えるboost::thread(boost::attributes, F, Args)ため、苦情があります。

最初boost::bindに明示的に使用してバインドし、バインド42fooれた関数オブジェクトでスレッドを開始してみてください。

このようなもの:

boost::function< void > f = boost::bind( foo, 42 );
boost::thread( attrs, f )
于 2012-12-13T21:31:18.587 に答える
1

転送の問題のようです。int値 42 で変数を定義し、それを 3 番目の引数として渡してみてください。

于 2012-12-13T21:25:34.347 に答える
0

必要なオーバーロード

template <class F, class Arg, class ...Args>
thread(attributes const& attrs, F&& f, Arg&& arg, Args&&... args) 

コンパイラが可変個引数テンプレートと右辺値参照をサポートしている場合にのみ定義されます。これはあなたの問題を説明するかもしれません。

これを明確に示すためにドキュメントを改善できると思います。この問題を追跡するために Trac チケットを作成していただけますか?

于 2012-12-15T18:31:28.080 に答える
0

属性に stacksize を指定する必要があります。以下に例を示します。

    #include <boost/thread.hpp>
    #include <boost/chrono.hpp>
    #include <iostream>

    void wait(int seconds)
    {
    boost::this_thread::sleep_for(boost::chrono::seconds{seconds});
    }

    void thread()
    {

    try
    {
        for (int i = 0; i < 5; ++i)
        {
        wait(1);
        std::cout << i << '\n';
        }
    }
    catch (boost::thread_interrupted&) {}
    }

    int main()
    {
    boost::thread::attributes attrs;
    attrs.set_stack_size(1024);
    boost::thread t{attrs, thread};
    t.join();
    }
于 2016-06-16T22:19:44.437 に答える
0

boost::bind次のように を使用する必要がある場合があります。

boost::function< void > f = boost::bind( foo, 42 );

boost::thread( attrs, f )
于 2016-03-29T05:40:17.387 に答える