web-dev-qa-db-ja.com

std :: queueスレッドはプロデューサーと複数のコンシューマーで安全です

キュースレッドを安全にするにはどうすればよいですか?プッシュ/ポップ/フロント/バックしてクリアする必要があります。ブーストに似たようなものはありますか?

私には1人のプロデューサーと1人以上のコンシューマーがいます。

13
unikat

std::queueへのアクセスを保護する必要があります。ブーストを使用している場合は、boost::mutexを使用して保護してください。ここで、複数のリーダーと1つのライタースレッドがある場合は、boost::shared_lock(リーダー用)とboost::unique_lock(ライター用)を確認してください。

ただし、ライタースレッドの枯渇に遭遇した場合は、boost::shared_mutexを参照してください。

2
mindo

_std::queue_は、1つ以上のスレッドが書き込みを行っている場合、スレッドセーフではありません。また、そのインターフェースは、外部で同期する必要があるpop()size()empty()などの個別のメソッドを持っているため、スレッドセーフな実装には役立ちません。

一般的なアプローチ* よりシンプルなインターフェイスでキュータイプを実装し、内部でロックメカニズムを使用して同期を提供することです。

*「並行キューC++」を検索すると、多くの結果が得られるはずです。私は非常に単純なおもちゃを実装しました ここ 、制限は標準のC++のみを使用することでした。 Anthony Williamsの本C++の同時実行、および彼のブログも参照してください。

10
juanchopanza

boost 1.53には、ロックフィーキューがあります http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html 、このようなミューテックスやsmthはありません。

1
Mike Minaev

あなたはそれを保護しなければなりません、例えばとともに std::mutex、on every操作。 C++ 11をまだお持ちでない場合は、Boostが代替手段になります。

0
MSalters