C++ 11アトミック操作でunique_ptrを安全に移動できますか?スレッドセーフunique_ptr move
std::atomic<std::unique_ptr<SyncToken>> syncToken;
をし、ミューテックスの必要性を回避:
現在、私は、私は単純に宣言するように、いくつかのよりエレガントな方法があるかどうかを疑問に思って、この
std::unique_ptr<SyncToken> DataManager::borrowSyncToken()
{
std::unique_lock<std::mutex> syncTokenLock(syncTokenMutex);
return std::move(syncToken);
}
のようなコードを持っています。またはおそらく私はここでロックについて気にする必要はありませんし、std :: moveはすでに原子的ですか?
は研究の後、私は今のところ、それは私には思える行わ:
- 自体を動かす:: stdがアトミックではなく、同時に私のメソッドを呼び出す周りにそうでない2つのスレッドが2つのコピーで終わるかもしれないいくつかの同期を持っている必要がありますいくつかの未定義のポインタの
- std :: atomic宣言が私のためにコンパイルされますが、初期化して移動を行う方法がわかりません。
std :: shared_ptrの回答とディスカッションをありがとう。その目的のために、コードは簡略化されていますが、それでも、nullptrを後のスレッドに返して、呼び出し側がトークンが利用できないことを知ることができるようにします。ここで解決された問題は、私は他のコメントで説明します。 –
クライアントは、読み込み、書き込みの2種類の操作をDataManagerで行います。 1人のクライアントだけがその時間に書き込むことができます。 **クライアントはスレッドではありません** - 場合によっては時々、クライアント用にバックグラウンドジョブが起動されることがあります。読み取り/書き込みは、単純な操作ではなく、DataManagerとクライアント間の複雑な通信プロトコルに従います。クライアント要求はトークンが利用可能になるまでブロックされる必要はありませんが、時には積極的に拒否されることもあります。混乱を避けるために、このSyncToken - WriterはSyncTokenを借りて、returnSyncToken(unique_ptr)を呼び出す必要がありました。 –