2013-03-10 55 views
9

私はこののWebSocketでstd::queueためboost::lockfree::queueを代用しようとしている++例https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppはboost :: lockfree :: queueであり、C++ 11ではロックフリーではありませんか?

それは本当にboost::unique_lock行を削除まだ構文を変更せずに行うことができるように見えます。私はブーストの例を見ると

しかし、それは私がlockfree::queue上のドキュメントに目を通すときlockfree http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

をチェックするコード部分を持って、それがis_lock_free()http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.htmlでこれを言う:

bool is_lock_free(void)const;

キューの先頭と末尾ノードと 空きリストがロックフリーの方法で修飾することができる場合には、唯一のチェック

警告。ほとんどのプラットフォームでは、 実装全体がロックされていません。 C++ 0x形式の アトミックを使用すると、完全な正確な の実装を提供する可能性はありません。 オペレーティングシステムからさらにノードを割り当てる場合は不可能な、すべての内部ノードをテストする必要があります。

戻り値:実装がロックフリーの場合はtrue。

「C++ 0x形式のアトミック」は何もわかりませんが、私はかなり確信しています。

私はC++ 11を使用していて、std::queueの代わりにboost::lockfree::queueを単に置き換えているので、lockfreeは実装されませんか?

+5

ロックフリーアルゴリズムにコミットする前に測定することをお勧めします。これらはきちんとしていますが、_scalable_と_safe_(つまり優先順位の逆転を防ぐ)に設計されています。たとえば、いくつかのコアと非常に多くの競合がない限り、Boostのロックフリーキュー実装はロックされた 'std :: queue'よりも遅くなります。 –

+2

'C++ 0x形式のアトミックが何であるか分かりません。[boost :: atomic](http://www.boost.org/doc/libs/1_53_0_beta1/doc/html/atomic)について語っています。 html)を参照してください。 –

+0

+1のlibの例 – ExoticBirdsMerchant

答えて

8

「完全に正確な実装を提供する可能性はありません」というコメントは、is_lock_free()を指します。すなわち、is_lock_free()が実装がロックフリーであるかどうかを正確に反映した結果を返すことは保証されません。しかし、is_lock_free()がtrueを返す場合は、実装にロックがかかっていない可能性がありますが、鋳鉄は保証されているわけではありません。

+0

ありがとうございました!あなたは上記の例で使用するのが安全だと言いますか、あるいは定期的にメッセージ/接続の喪失を期待するべきですか? –

+0

何か迷子になるのをなぜ期待していますか? –

+0

@CoryNelson私は完全にC + +経験がないので。 'is_lock_free'は、ロックフリーでない状況があるように聞こえるので、メッセージ/接続の喪失のような"悪い "ことが起こるかもしれません。 –

-7

「C++ 0x形式のアトミック」は何もわかりませんが、私はかなり確信しています。

  • C++ 0Xは、C++ 03及び/又はC++ 07 C++標準を指します。
  • C++ 1xは通常C++を指します。11
  • C++ 1yは、C++ 11後継者を指します。
+6

これはまったく間違っています。 C++ 0xとC++ 1xはともにC++ 11を指します。 C++ 1yはC++ 14またはC++ 17を指しますが、通常は前者を指します。 –

関連する問題