問題タブ [lockless]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - boost::lockfree::queue (マルチスレッド プログラム内) はロック可能ですか?
私は、2+ (gstreamer) boost::スレッドと、ダミーアプリケーションの同じ数のboost::スレッドがキューを同時に使用しているプログラムに取り組んでいます。現在、このキューは、 gstreamer スレッドのタスクとそれに対応するダミー アプリケーション スレッドとの間の同期に使用されます。
キューは EVENT キューです: EVENT は構造体です
グーグルで調べたところ、マルチスレッドアプリケーションに使用されていることを示唆する、キューの2つのオプションlockfree::queueとlockfree::spsc_queueに出会いました。lockfree::queues
混乱: なぜ lockFREE という名前なのですか? (ミューテックス)ロックできないことを示唆していますか?
この例も参照してください。「boost::lockfree::queue はロックフリーではありません」と表示されています。
心=吹き飛ばされた...
次に、例(上記のリンク)に従って、このキューを実装してみました
そしてその定義は次のとおりです。
これは正常にコンパイルされます。しかし、私はここで完全に暗闇の中を走っています。
質問:
この例でキューを次のように宣言する理由
boost::lockfree::queue<int> queue(128);
その128は何のためにあるのですか?キューのサイズが 128 (バイト/アイテム) であるということですか? queue<int>
キュー内のデータの型を宣言していますか?
私のプログラムでうまくいかなかったのはなぜですか
boost::lockfree::queue<EVENT> mqSttEventQueue(128);
このように宣言すると、次のようにコンパイルエラーが発生します
PS:- ここにどのタイトルを入れたらよいか本当にわかりません...できれば編集してください。
c++ - Lockless circular buffer with single producer singular consumer
I have a consumer thread that must never lock nor allocate memory, and a producer thread that can. I want to implement a two place circular buffer to be able to provide data to the consumer thread from the producer, with the bound that whenever no new data is available to consume, the consumer just re-uses the already available data.
This is what I've come up with for now:
Is this naive implementation ok? I know reading and writing to variables can be non-atomic, so I should use an atomic storage, but those can cause locks. Is the use of atomic storage needed here?
Also, I'd like to eliminate the active wait in the producer, and I thought I could use a std::condition_variable
, but they require the use of mutexes and I cannot afford them.
c++ - ハッシュテーブルへの書き込みと読み取りを同時に行う
次のように、同時に挿入して読み取ることができるベクトル型のオブジェクトを実装できるはずです。
- ベクトルにスペースがある場合は、挿入するだけです。これは読書を妨げるべきではありません。
- 再割り当てする必要がある場合は、割り当て、コピー、データへのポインターの更新、解放を行うことができます。
- ベクトルから読み取りたい場合は、データへのポインターのフェッチとデータからの読み取りがアトミックに行われるようにする必要があります。
このように、再割り当て中にベクターから読み取ると、まだ有効な古い場所から読み取るだけです。(もちろん、削除はスレッドセーフではありませんが、それで問題ありません。何かを削除したい場合は、それを考慮に入れる必要があります。とにかく、std::vector
現在持っているものより悪くはありません。)
次に、これをあまり問題なくハッシュテーブルに適合させることができるはずです。これらのベクトルの 1 つをバケットに使用し、各バケットをこれらのベクトルの 1 つに戻すだけです。(最適な漸近的複雑さを得るために、ある種の自己均衡二分木でバケットをバックアップする必要があることは理解していますが、私のアプリケーションではベクトルが問題なく、ここで物事をあまりにも大きく逸脱したくありません。)
2 つの質問:
- これは理にかなっていますか、それとも何か不足していますか? (スレッドセーフに対する直感は信用できません。)
- もしそうなら、C++ 標準ライブラリのコンテナのいくつかをプリミティブとして使用して、これまたはそのようなものを構築することは可能ですか?それとも、すべてをゼロから作成するしかありませんか?
std::atomic
(もちろん、いくつかの場所で使用すると思いますが、std::vector
またはstd::unordered_map
ここのようなものを使用する方法はありますか?)
あるいは、このテーマについて読める本や何かがありますか?