3

shared_ptrマルチスレッドがない場合、 (boost または tr1 のいずれかから) を使用するためのコピー オン ライトの実装 unique()は簡単です。マルチスレッド化する場合、どの変更を行う必要がありますか? 参照カウントはアトミックであるため、インスタンスの作成、コピー構築、読み取り、および破棄を特に気にすることなく実行できると想定していますshared_ptr。一般に、特にコピーオンライトを実装する場合は、それらを更新するのはどうですか? ロックは必要ですか?または使用しますboost::atomic_store か(なぜ文書化されていないのですか)?shared_ptrまたは、 (オプションではない)の完全にアトミックなバージョンを待ち ますか?

編集:
sfossen、役に立つ返信をありがとう。
したがって、現在のスレッドのみが所有するように、COW を介してデタッチした後にのみポイント先オブジェクトを変更する場合、ロックは必要なく、アトミック ref で shared_ptr を使用する場合、COW 実装はシングルスレッドのものと同じように見えると結論付けます-カウントします。

4

2 に答える 2

6

COWを使用すると、変更の途中にある可能性のあるオブジェクトをコピーするときにのみロックが必要になります。

したがって、オブジェクトのCOWがスレッドの前に設定されたオブジェクトであり、変更されない場合は、ロックは必要ありません。

ただし、コピーのコピーを作成する場合は、最初の書き込み中に少なくともロックするか、コピーがすべて変更されていることを確認してから、再度コピーできるようにする必要があります。

それらを完全に保証できない場合は、ロックまたはアトミック更新を使用してください。

ロックしたい場合:

現在、トランクにはアトミックバージョンがあるようです。

Boostを更新できない場合は、今のところ必要な関数をインポートするか、リーダー/ライターロックのようなロックでラップすることができます。

shared_ptr.hppから

template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T> r )
{
    boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p );

    sp.lock();
    p->swap( r );
    sp.unlock();

    return r; // return std::move( r )
}

RWLocksに関する記事

于 2009-03-05T23:20:40.690 に答える
0

コピーを実行するスレッドによって所有されていない限り、なんらかの形式の同期なしで shared_ptr をコピーすることは安全ではありません。スレッド セーフの保証は、スレッドが所有する shared_ptr にのみ適用されます。この場合、shared_ptr の内部参照カウントは、他のスレッドが所有する shared_ptr によって共有される可能性があります。

あなたが望む動作は、現在shared_ptrに存在せず、おそらくC ++ 0xの後でも存在しないアトミックスレッドセーフを呼び出すことです。同期しないとスレッド間で shared_ptr を実際に共有できないため、shared_ptr という名前はおそらくここでは少し混乱します。

于 2009-03-08T14:18:10.517 に答える