2

現在、かなりの数のテストに次のコードを使用しており、問題は発生していませんが、コードがスレッドセーフではなく、競合状態につながる可能性があることに気付きました。

...
std::shared_ptr<T> ptr(new T(bar));

auto foo = [=] (tbb::blocked_range<int> r) {
     std::shared_ptr<T> p(ptr); // <- Is this threadsafe?
     // ... do stuff
};

tbb::parallel_for(tbb::blocked_range<int>(0,x), foo);
...

私の質問は、マークされた行に関するものです。共有ポインターのコピー構築中に、参照カウントの増加により競合状態が発生する可能性があると思います。

ポインターを参照でキャプチャして直接使用することで回避できましたが、それでも解決策に興味があります。

4

1 に答える 1

1

いいえ、マルチスレッドのオプションをオンにしてコンパイルする場合、ライブラリは共有ポインターの参照カウントにアトミック操作またはロックを使用する必要があります。あなたが投稿したように、コードにはスレッドセーフの問題はありません。

于 2011-12-20T20:26:56.767 に答える