5

Boost :: shared_ptrをWindowsスレッド関数へのポインターとして渡すにはどうすればよいですか?次のコードを想定します:

test::start()
{
    ....
    _beginthreadex( NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID );

    ...
    ...
}

/*this is a static function*/
UINT __stdcall test::threadRun( LPVOID lpParam )
{ 
     shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam);
     ...
}

このコードは間違っていると思いますが、あなたの考えは何ですか?これどうやってするの ?

編集:私はboost::weak_ptrによって私の問題を解決しました。このページで自分の答えを確認してください

4

4 に答える 4

3

クラスから静的関数/メソッドにパラメーターを渡す必要があり、コールバックパラメーター(通常はスレッドコールバック)がある場合、通常はthisコールバックに渡します。このようにして、1つの単純なキャストがあり、クラスのすべてのメンバーにアクセスできます。実際には、コールバックはクラスのメンバーとして行われます。

test::start()
{
    // [...]
    _beginthreadex(NULL, 0, &test::threadRun, this, 0, &threadID);
    // [...]
}

// this is a static function
UINT __stdcall test::threadRun(LPVOID lpParam)
{ 
     test* self = static_cast<test*>(lpParam);

     // do whatever you want with all the instance members :)

     self->getMyShared();
     self->useMyGreatMemberMethof();

     // ...
}

my2c

于 2011-02-24T08:46:59.627 に答える
1

を使用しreinterpret_cast、スポーン中に少なくとも1つのshared_ptrを保持するように注意する必要があります。そうしないと、オブジェクトが破壊されます。つまり、shared_ptrにポインターを渡すため、通常のポインター保護を享受できず、既存のshared_ptrsがすべて破棄されると、スレッドが生成されたときに不正なポインターが含まれます。

于 2011-02-24T08:29:32.827 に答える
1

私はboost::weak_ptrで問題を解決しました:

test::start()
{
    ....
    shared_ptr<test> shPtr = shared_from_this();
    boost::weak_ptr<test> wPtr=shPtr;
    _beginthreadex( NULL, 0, &test::threadRun, &wPtr, 0, &threadID );

    ...
    ...
}

/*this is a static function*/
UINT __stdcall test::threadRun( LPVOID lpParam )
{ 
shared_ptr<test> k      = static_cast< boost::weak_ptr<test>* >(lpParam)->lock();
     ...
}
于 2011-02-24T09:58:21.660 に答える
0

これは、実際に侵入参照カウントがうまく機能する状況の1つです。

渡したい場合boost::shared_ptrは、侵入参照カウントのある構造体に入れて渡すことができます。

これは、生のポインターを渡して、終了時に受信スレッドにそれを削除させるだけではないことを前提としています。

于 2011-02-24T12:16:33.080 に答える