問題タブ [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++ - 「ネストされた」scoped_lock
私の短縮された単純化されたクラスは次のようになります。
へのアクセスを同期したいと思いますm_myVar
。を呼び出すA::methodB()
と、スレッドは同じミューテックスで2回ロックに遭遇し、明らかに最初の行でブロックしますA::methodA()
再度渡すときに同じスレッドscoped_lock
をブロックしないようにする方法はありますか?
もちろん、私は単純に を呼び出すことができますm_mutex.unlock()
。しかし、これにより、ロックを待機している他のスレッドも解放されます。これは、私が望んでいることではありません。
何か案が?
宜しくお願いします トバイアス
c++ - boost::shared_mutexは使用できません
タイプが非静的メンバーの小さなテンプレートクラスがありboost::shared_mutex
ます。コンパイルしようとすると、エラーが発生します。
'boost::shared_mutex::shared_mutex' : cannot access private member declared in class 'boost::shared_mutex'
。
boost::shared_mutex
実際にはプライベートのネストされたクラスshared_mutex
がありますが、なぜこの問題が発生したのかわかりません。
これが私のクラスです:
同じことが通常の`boost::mutex'でも起こります。
別の非テンプレートクラスがあり、どちらのミューテックスタイプでも問題はありません。
c++ - ブースト スレッドを使用した MSVC++ 6.0 のカスタム シリアル サーバー クラスでのアクセス違反
イーサネット、シリアル ポート、および/または GUI からコマンドを受け取り、それらを処理し、イーサネットおよびシリアル チャネルを介して結果を出力できる必要があるアプリケーションがあります。ホスト OS は Windows NT4.0 なので、MSVC++ 6.0 と Boost ライブラリ バージョン 1.34.1 に限定されます。シリアル ポート サーバーとして機能するクラスを作成しました。別のスレッドで、ポートを開いてハンドルを取得するクラスのコンストラクターが呼び出されます。次に、その関数「ProcessMessages」が呼び出され、受信メッセージのシリアル ポートを常に監視します。
メッセージを処理した後、結果をシリアル ポートに書き込む必要があります。シリアル ポートへのハンドルを使用しようとすると、アクセス違反が発生します。ミューテックスを使用する必要があると考えていますが、私独自の状況に一致するブースト ミューテックスの良い例が見つかりません。誰にもアイデアはありますか?
c++ - boost::mutex をデストラクタから解放する
スレッドセーフではないため、スレッドセーフにする非常に単純なカプセル化std::vector
を構築しようとしていました。
これは非常にうまく機能しますが、小さな問題が 1 つあります。クラスのインスタンスが破棄され、別のスレッドがまだそのインスタンスからデータを読み取ろうとしている場合、スレッドは永久にハングし続けます。boost::mutex::scoped_lock lock(m_mutex);
どうすればこれを解決できますか?最善の方法は、ミューテックスにぶら下がっているスレッドが実行を継続できるように、ミューテックスのロックを解除することです。今までは必須ではなかったので、デストラクタを定義していません。
ここに私のコード。ここに示されている以外にもメソッドがあることに注意してください。簡略化されています。
編集定義を変更する必要があります。前に述べたように、コンテナは明らかにスレッドセーフではありません。命名法が誤解を招くものであっても、そうすることは想定されていません。確かに、まったくスレッドセーフではないことを行うことができます! ただし、コンテナーに書き込むスレッドは 1 つだけで、コンテナーから読み取るスレッドは 2 つまたは 3 つです。プロセスを停止しようとするまではうまくいきます。モニターの方が良かったと言わざるを得ません。しかし、時間がなくなり、それまでこれを変更することはできません。
どんなアイデアでも大歓迎です!ありがとうございます。
c++ - ベクトルコピーとマルチスレッド: 時折書き込みが発生する可能性がある場合でも、マルチ読み取りを確実にする方法は?
プログラムはマルチスレッドです。多くのスレッドが を検索する可能性がありますが、ベクトルのコピーは単一のスレッドによってのみ行われますが、時折行われます。問題は何であれ、vector_search は失敗しないはずです。vector_copy は延期できますが、vector_search は延期しないでください。遅延も障害パターンもありません。問題は、 vector_search がまったく失敗しないように、永続的でなければならない共有変数 vectora です。これを達成するための最適な方法は何ですか?
編集 :
アップグレード可能な所有権を持つスレッドがアップグレードを試み、他のスレッドが所有権を共有している場合、その試みは失敗し、排他的な所有権を取得できるまでスレッドはブロックされます。 --boost-ドキュメンテーション
秘訣は、ベクターのコピーが非同期で行われ、排他的な所有権が取得された後に行われることです。したがって、ベクターコピーは最終的に発生しますが延期され、実際にベクターコピーも失敗しない操作ですが遅延します。これは私にとっては問題ありません。何らかの形で同期のためにロックがかかり、少なくとも 1 ミリ秒はブロックされます。しかし、このスワップを使用する利点は、時間の短縮につながり、無視できるようになります。
c++ - ブーストnamed_mutexは、異なるユーザーによって作成されたプロセス間で共有できません
異なるユーザーによって作成されたプロセス間でmutexという名前のブーストを共有する際に問題があります。最初のプロセスは、LocalSystemとしてログオンするサービスによって作成されます。2番目のプロセスは自分で作成します(プロセスを通常どおり実行するだけです)。
両方のプロセスがこの関数を実行します(C ++):
現在、両方のプロセスがDoSomeWork()に同時に入ることができることを確認しています。この問題は、サービスが「自分」としてログオンした場合にのみ発生するわけではなく、2番目のプロセスを管理者として実行します。
これの代わりに、ブーストまたはいくつかの単純なコードでこの問題を解決する方法はありますか? http://support.microsoft.com/kb/193073
(ミューテックス名を「Global \ mymutex」に設定しようとしましたが、ミューテックスを作成できません)(Windows CreateMutex()も使用しようとしましたが、kb193073で説明したように、同じ問題が発生します)
ありがとう!
サイモン
c++ - 手動でブースト ロックを解除しますか?
boost::thread の組み合わせ論を学習するために、共通ミューテックス (M) をロックするスレッド用の単純なバリア (BR) を実装しています。ただし、BR.wait() に移動したときに得られる限り、ミューテックスのロックは解放されないため、すべてのスレッドが BR に到達するには、M のロックを手動で解放する必要があります。だから私は次のコードを持っています:
M.unlock() は明らかに悪い解決策です (ロックを使用しない)。では、ロックを(単に)解除する方法は?また、すべてのスレッドが終了するまで main() で (適切に) 待機するにはどうすればよいですか? (TH2.join() はまずい。TH2 が最初に終了する可能性があるため...);
私も使用できる条件変数を使用するなど、回避策を提案しないでください。
c++ - boost::lock_guard は永久に待機します
マルチスレッド環境でブースト ミューテックスとロックを使用して、C++ で LRU キャッシュを開発しています。アーキテクチャは、boost::unordered_map +ロックフリー キューに基づいています 。挿入はノンブロッキング モード (try_lock) で動作しますが、削除はマップをロックして続行する必要があります。問題は、ごくまれに、削除時にキャッシュ アクセスがデッドロックになることです。
.h
.cpp
何が悪いのか説明してもらえますか? 取得する必要がある唯一のロックであるため、削除でデッドロックが発生することはほぼ確実です。
みんなありがとう
編集: mpm_prefork_module を実行する apache モジュールでこのキャッシュを使用しています: これは問題でしょうか? boost::thread の代わりに boost::interprocess を使用する必要がありますか?
c++ - boost::interprocess_mutex と比較して、共有メモリ内で boost::mutex を使用しないのはなぜですか?
しばらくの間、怒りの中でブースト共有メモリを学習して使用していたので、どのタイプのミューテックスをいつ使用するかのメンタルモデルにたどり着きました。それは次のようになります。
原則としてこれが間違っていないことを願っていますので、間違っている場合は修正してください。私の意図は、この図に準拠していない既存のコードと自分自身のコードを前進させて修正することですが、確実にしたいと思います。
この質問には 2 つの部分があります。本当に問題ないと思いますが、//2 を使用するのは無意味です。コンテキストでは、これは //1 よりも良くありませんが、その理由は何ですか? パフォーマンス?
//3 については、私の推測は正しいですか? 機能しない理由、または少なくともどのような状況では機能しないのか、技術的な舞台裏の理由を誰かが説明できますか?
c++ - スレッドセーフではないクラスのBoost::Mutex
私は並行プログラミングを学んでおり、私がやりたいのは、各オブジェクトが独自のBoost:Threadの実行を担当するクラスを持つことです。このコードは、私があまり慣れていない多くの機能(動的に割り当てられたメモリ、関数ポインター、同時実行性など)を使用しているため、少し頭がおかしくなります。それは、コードのすべての行がそれを正しくするためにいくつかの参照をチェックしなければならなかったようなものです。
(はい、割り当てられたすべてのメモリは実際のコードで考慮されます!)
ミューテックスに問題があります。私はそれを静的と宣言し、すべてのインスタンスで同じ値を取得しているようです(そうあるべきです)。コードはまだスレッドセーフではありません。
ミューテックスは、他の誰かがスレッドをロックした場合に備えて、スレッド(右?)がそれ以上進行しないようにする必要があります。ミューテックスはスコープが設定されており(優れた機能の一種)、ifステートメント内にあるため、他のスレッドを探す必要はありませんか?それでも私は、スレッドセーフではないことを明確に示唆するコンソール出力を取得します。
また、静的な変数の権利を使用しているかどうかもわかりません。さまざまな参照方法(Seller :: ticketSaleMutex)を試しましたが、機能したのは「this-> ticketSaleMutex」だけでした。これは非常に日陰に見え、静的であるという目的に反しているようです。
Seller.h:
Seller.cpp:
main.cpp: