問題タブ [boost-mutex]
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::mutex の破壊が失敗する
はじめに:このエラーの発生に関する多くの投稿を読みました (例: boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed )。
さらに、これらの投稿でよく提案されているように、RAII を使用できません。
さらに、このエラーは発生しないため、「最小限のコンパイル例」を示すことはできません。
私の問題: FIFO リストを表すクラスに 2 つのミューテックスがあります。これらのミューテックスは、アンカー ポインターとバック ポインターをロックするために使用されます。
クラスが破棄された時点で、 が破棄されたback_mutex
後で の破棄は失敗しますanchor_mutex
。これはエラーメッセージです:
POSIX-Specpthread_mutex_destroy
によると、失敗するのはEINVAL
、mutex が無効なEBUSY
場合と、mutex がロックまたは参照されている場合の 2 つのみです。
その知識のために、テストのためにデストラクタを次のように変更しました。
それにもかかわらず、エラーは依然として同じ位置にあります。EINVAL
2 つのケースのいずれかEBUSY
が関連している場合、mutex のロックとロック解除は失敗するはずです。また、デストラクタを呼び出すスレッドが、他のすべてのスレッドが以前に参加した最後の生きているスレッドであることを保証できます。
追加のテストとして、push_back と pop_front の最初の行に return を書きましたが、エラーは発生しません。push_back のみを使用した場合にも発生します
「一種の」完全性のために、push_back および pop_front メソッドでミューテックスを使用するコード:
質問: 「機能している」mutex の破棄に失敗する可能性はありますか? それとも私はここで何かを監督していますか?どうすればそのエラーを取り除くことができますか? コードと仮定のどこが間違っていますか?
c++ - (ブースト) conditional_variable と共に使用した場合の unique_lock のオーバーヘッド
wait()
のメソッドは、単純ではなくオブジェクトをパラメーターとしてboost::conditiona_variable
必要とするのはなぜですか?boost::unique_lock
boost::mutex
実際のところ、unique_lock の目的はまったく明確ではありません。の周りに別のラッパー オブジェクトを作成する必要があるのはなぜboost::mutex
ですか? また、パフォーマンスにどのような影響がありますか?
たとえば、2 つのスレッドがあるthread1
としthread2
ます。
の上thread1
オンthread2
:
この場合、条件変数unique_lock
のメソッドを呼び出す必要があるたびに新しいオブジェクトを作成するのは無駄だと思います。wait()
そのようなオブジェクトの目的と、それらが大きなオーバーヘッドをもたらすかどうかについて教えてください。
ありがとう!
(私の質問はこの質問と重複しているようですが、私の懸念は目的よりもオーバーヘッドです...)
c++ - C++ で実行中のインスタンスの数を制限する方法
多くのメモリを割り当てる C++ クラスがあります。これは、メモリを割り当てられない場合にクラッシュするように設計されたサードパーティ ライブラリを呼び出すことによって行われ、アプリケーションが並列スレッドでクラスの複数のインスタンスを作成することがあります。スレッドが多すぎるとクラッシュします。解決策としての私の最善のアイデアは、たとえば、同時に 3 つを超えるインスタンスが実行されないようにすることです。(これは良いアイデアですか?) そして、それを実装するための私の現在の最良のアイデアは、ブースト ミューテックスを使用することです。次の疑似コードの行に沿った何か、
ご覧のとおり、ここでのミューテックスの正確な構文についてはよくわかりません..要約すると、私の質問は
- スレッド数を制限してメモリエラーを解決したい場合、正しい方向に進んでいますか?
- はいの場合、ミューテックスまたはその他の方法で行う必要がありますか?
- はいの場合、私のアルゴリズムは健全ですか?
- ブーストミューテックスで try_lock を使用する方法の良い例はありますか?
編集:プロセスではなく、スレッドについて話していることに気付きました。編集: Linux と Windows の両方で実行できるアプリケーションの構築に携わっています...
c++ - firebreathプラグインでブラウザが閉じないようにする
不明なランダムな時間がかかるデータを保存しているため、ブラウザが閉じないようにしたいプラグインがあります。
データを保存する場所を尋ねるプロンプトが表示されますが、すぐにクラッシュします。これはロックであると推測しています。ユーザーがデータの保存を完了するまでブラウザを待機させるにはどうすればよいですか?
c++ - ミューテックスロック待ちの処理
ミューテックスがロックされるのを待っている間にコード セクションを実行する方法はありますか?
アプリケーションのパフォーマンスに対する唯一の真の内部ヒットはデータベースの相互作用であり、データベースの相互作用が原因で競合が発生する可能性がある厳密な同期が必要な場合があるため、ロックを待っている時間を使用して、データベース。
たとえば、コードを疑似的に次のようにしたいと思います。
ブーストの同期セクションを調べたところ、意図が達成されたようfutures
にrecursive
聞こえますが、意図を実装する方法がわかりません。
私の意図はどのように実装できますか?