問題タブ [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++ - Using boost::mutex::scoped_lock inside const function
This code won't compile:
But defining the function as non const will work fine. Please, can someone explain why? Thanks!
c++ - Boost with C++ - 不思議なミューテックスの振る舞い
Boost
マルチスレッドBoost
アプリケーションを作成してWindowsまたはLinuxでコンパイルできることを知っているので、私はスレッドを試してpthreads
います.
別の SO question から借用した次のサンプル アプリケーションがあります。
次の方法で、Ubuntu 14.04 LTS システムに Boost をインストールしました。
そして、次の方法で上記のコードをコンパイルします。
いくつかの興味深い矛盾のように見えるものに出くわしました。longy NAP_DURATION
、たとえば 1 秒 ( ) を設定すると、操作が完了するまで1000000
スレッドのみがミューテックスを取得するように見えます。スレッドが完了するまでスレッドがロックを取得することは非常にまれです。数ミリ秒。1
2
1
NAP_DURATION
を使用して同様のアプリケーションを作成しpthreads
た場合、別のスレッドがミューテックスで既にブロックされているため、通常、ロックはスレッド間で多かれ少なかれランダムに交互に行われます。
それで、質問に:
- これは予想される動作ですか?
- ロック操作がキューに入れられたようにスコープ ロックを動作させるなど、この動作を制御する方法はありますか?
- (2) に対する答えが「いいえ」の場合、条件変数を使用して同様のことを達成し
Boost
、ロック/ロック解除の呼び出しが失敗することを心配する必要はありませんか? scoped_lock
ロック解除は保証されていますか?どうやらロック解除操作が失敗して例外をスローする可能性があるため、手動でロック/ロック解除するのではなく、RAII アプローチを使用しています。このコードを確実なものにしようとしています。
ありがとうございました。
明確化
呼び出しスレッドをスリープ状態にしてもミューテックスのロックが解除されないことは承知していますが、それはまだスコープ内にあるためですが、予想されるスケジューリングは次のようなものでした。
- Thread1 がロックし、mutex を取得します。
- Thread2 のロック、ブロック。
- Thread1 が実行され、ロックが解放され、すぐに再度ロックが試行されます。
- スレッド 2 は既にロックを待機しており、スレッド 1 の前にロックを取得します。
c++ - boost::named_mutex: Safely cleaning up when last process closes
I have a resource which I need to protect access to within a process, and across multiple processes. I've managed this by creating a named mutex via boost::interprocess:named_recursive_mutex
, and it works great.
However, it's to my understanding that this should be cleaned up eventually via remove()
, ie:
However, this call appears to completely clobber the mutex, rather than check/decrement a reference count, so I'm trying to find a safe way to issue the remove()
call when I know that no other processes are using it. I could create a chunk of shared memory via boost as well, but that does not appear to have a shared reference count either.
I've found a similar question on SO, but the accepted answer doesn't seem adequate for my needs, as it just refers to the "boost docs", but doesn't give a clear indicator as to when remove()
can be safely issued.
How can I safely clean up this named mutex when I'm certain the last process accessing it has closed, or possibly crashed?
Thank you.
c++ - エラー : Boost_Mutex.exe の 0x76f6f9d2 で例外 (最初のチャンス): 0xC0000008: 無効なハンドルが指定されました
マルチスレッドをテストするプログラムを作成します。main
関数で aがthread t
作成されます。function D
にある では、thread t
2 つのスレッドtt
とttt
が作成されます。関数Process
は で実行されthread ttt
ます。のProcess
メンバー関数で呼び出されます。メンバー関数で呼び出されます。doAnotherThing
class Dat
thread tt
doOneThing
このプログラムをデバッグすると、エラーが発生しました。An exception (first chance) at 0x76f6f9d2 in Boost_Mutex.exe: 0xC0000008: An invalid handle was specified.
上記のエラーの代わりに、 次のエラーが発生する場合がありました。
この問題を解決してコードを変更するのを手伝ってくれる人はいますか?
これらは私のコードです:
「ダット」
「Dat.cpp」
「main.cpp」
私の質問のこの文に提案がある場合は、教えてください。修正します。ありがとうございました
c++ - c/c ++で完全に(純粋に)ユーザー空間をロックするためのboostまたはstlクラス?
アトミック命令を利用し、ユーザー空間でのみ実行される同期ロックを実装するクラスがブーストまたは std STL に存在しますか? このような実装では、スレッドが継続的にスピンしてロックを取得すると確信していますが、私のユースケースでは問題ありません。そのようなサンプル実装の 1 つがここにあります。しかし、これは非常に単純なロックで、1 つのリーダーまたは 1 つのライターのみを許可します。単一のライターまたは複数のリーダーを使用したロックの実装を許可する必要があると予想しています。
c++ - ロックを待機する代わりに、プロセス間ミューテックスのクラッシュを促進しますか?
私はかなりの数日間これに取り組んできました(boostフォーラムにも投稿されました)が、ロックされたミューテックスを2番目のプロセスに認識させることができないようです。助けてください。これはコードです:
共通ヘッダー ファイル: SharedObject.hpp
これは最初のプログラムです:
そして、これが 2 番目のプログラムです。
プログラム 1 は問題なく動作します。
プログラム 2 の出力は次のとおりです。
最初に program1 を実行しています。これにより、ミューテックスがロックされ、60 秒間ロックされたままになります。その間、プログラム 2 を実行して、ロックを待機しているかどうかを確認しましたが、クラッシュしました。プログラム 1 が共有メモリへの書き込みを完了するまで、プログラム 2 をミューテックスで待機させるにはどうすればよいですか?
multithreading - ミューテックスを所有している場合でも、ミューテックスの try_lock が false を返すのはなぜですか?
次の簡単なコードを検討してください。
コードプリントのCan't use lock
. 私のプログラムでは、スレッドがロックに対する排他的権利を持っている場合にのみ非同期操作を実行する必要があるため、これは問題です。そう:
- そのミューテックスを所有しているのに、try_lock が false を返すのはなぜですか?
- ロックを所有するスレッドによってのみ実行されるコード ブロックを作成するにはどうすればよいですか?