1

Boost 1.43スレッドを使用すると、以下をコンパイルできます。

void MyClass::threadFn(...) { ... }
void MyClass::doFn(...) {
    ...
    boost::thread(&MyClass::threadFn, this, ...);
}

ただし、以下はコンパイルできません。

void MyClass:doFn(...) {
    ...
    struct MyStruct {
        MyStruct(...) { ... };
    }

    boost::thread(&MyStruct, ...);
}

これにより、が得られ'MyClass::doFn::MyStruct': illegal use of this type as an expressionます。MyStruct;のインスタンスへのポインタを渡そうとしていないことに注意してください。関数ポインターと同じように、型自体を渡そうとしているので、boost::thread型のコンストラクターが呼び出されます。

Boost 1.43スレッド仕様によると:

呼び出し可能なタイプのオブジェクトを渡すことにより、新しいスレッドが起動されます

structでは、その型のアドレスを関数に渡すにはどうすればよいですかboost::thread(AFAIKこれはに適用されますboost::bind)?

関数を使用してこれを実現する方法についてさらに読む

4

3 に答える 3

1

MyStruct は呼び出し可能な型ではありません。MyStruct で動作する関数を定義し、代わりにその関数を使用してスレッドをインスタンス化する必要があります。

スレッドは実行コンテキストであり、スレッドをインスタンス化するには、実行するための一連の命令が必要です。

Java では、これは Runnable の形式で表示されます。これは、Thread をインスタンス化するために使用され、その後start()ed にすることができます。

Boost を使用する C/C++ では、関数ポインタを使用する必要があります。

「呼び出し可能な型」という用語は、大まかに「関数ポインタと交換可能な型」に翻訳されます。

あなたの例のように、任意の構造体を操作したい場合は、MyStruct最初にその型を操作する一連の命令 (関数) を定義する必要があります。

一連の命令がわかれば、その関数にポインタを渡してスレッドをインスタンス化し、MyStruct の任意のインスタンスでそのスレッドを実行できます。

コードは次のとおりです。

struct MyStruct {
        MyStruct(...) { ... }
    };

int frobnicateMyStruct( const MyStruct& msr ) {

    /* some operations on msr */

    return 0;
}    

void foo() {

    MyStruct myStructInstance;
    boost::thread(&frobnicateMyStruct, myStructInstance);

    /* ... */

    return;
}
于 2012-09-13T02:16:16.840 に答える
1

目的が何であるかはよくわかりませんが、次のように呼び出しますMyStruct()

boost::thread(boost::bind(boost::value_factory<MyStruct>()));

たとえば、次のように引数を渡すこともできますMyStruct(int i, int j)

boost::thread(boost::bind(boost::value_factory<MyStruct>(), 1, 2));
于 2012-09-13T01:14:48.253 に答える
0

それ以外の:

boost::thread(&MyStruct, ...);

インスタンスを呼び出します。

boost::thread(MyStruct(), ...);
于 2012-09-13T01:12:10.660 に答える