問題タブ [boost-thread]
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++ - 実行時にミューテックスまたはダミー ミューテックスを選択する
複数のプロジェクト間で共有されるクラスがあり、その一部はシングルスレッドで使用され、一部はマルチスレッドで使用されます。シングルスレッド ユーザーはミューテックス ロックのオーバーヘッドを望んでおらず、マルチスレッド ユーザーは独自のロックを実行したくなく、オプションで「シングルスレッド モード」で実行できるようにしたいと考えています。したがって、実行時に実際のミューテックスと「ダミー」ミューテックスを選択できるようにしたいと考えています。
理想的にはshared_ptr<something>
、実際のミューテックス オブジェクトまたは偽のミューテックス オブジェクトを割り当てます。次に、その内容に関係なく、これを「ロック」します。
現在は がありますがsignals2::dummy_mutex
、 と共通の基本クラスを共有していませんboost::mutex
。
では、上記の例よりもロック/ガード コードを複雑にすることなく、実際のミューテックスとダミー ミューテックス (signals2 のいずれかまたは他のもの) を選択するエレガントな方法は何ですか?
そして、代替案を指摘する前に:
- コンパイル時に実装を選択することもできましたが、プリプロセッサ マクロは見苦しく、プロジェクトの構成を維持するのは大変です。
- マルチスレッド環境でのクラスのユーザーは、クラスが内部で独自のロックを行うよりも、クラスの使用をロックする責任を負いたくないでしょう。
- 「スレッドセーフなラッパー」が実用的なソリューションになるには、あまりにも多くの API と既存の使用法が関係しています。
java - Jace JNI を使用してマルチスレッドのネイティブ呼び出しを行うと、Tomcat がクラッシュする
Netbeans を使用して、c++ ネイティブ dll をロードする Java Web プロジェクト (Tomcat 6.02 ベース) を構築しています。Jace
JNIをラップするライブラリを使用しています。
私のJavaコードには、C++コードから呼び出す静的コールバック関数があります。boost.Thread を使用して新しいスレッドでこのコールバックを呼び出そうとしていますが、Tomcat はメッセージやクラッシュ レポートなしで終了します。ただし、関数を直接呼び出すと、正常に機能します。
何が間違っているのか教えてください。
以下は、クラッシュを引き起こす私の C++ コードです。
以下は、正常に動作する私の C++ コードです。
Functor クラス (クラッシュの原因):
以下は私のJavaコードです:
編集:
奇妙なことに、次のコードも機能します。つまり、ファンクターを 1 回呼び出してから複数のスレッドを作成しても、クラッシュは発生しません。また、このクラッシュは Tomcat でのみ発生し、スタンドアロンの Java アプリケーションを作成した場合には発生しません。なぜこれが起こるのか誰か説明してもらえますか?
c++ - Boost.Threads を使用した ReadWrite ロック (この単純なクラスを変換する方法)
Windows から Linux (Ubuntu 9.10) にいくつかのコードを移植しています。Windows 関数を使用して単純なミューテックス ロックを実装する単純なクラス (以下を参照してください) があります。Boost.Threads を使用してこれを再実装したいのですが、そのライブラリは初めてです。
WIN固有の関数の代わりにBoost.Threadsを使用するために、以下のクラスに加える必要がある変更を誰かが指摘できますか?
c++ - boost::thread_group - join_all の後に create_thread を呼び出してもいいですか?
次のような状況があります。
boost::thread_group インスタンスを作成し、いくつかのデータを並列処理するためのスレッドを作成してから、スレッドで join_all を作成します。
最初に、次のように、データの X 要素ごとにスレッドを作成しました。
しかし、これには問題があります。大量のデータがある場合、このコードは多くのスレッド (> 40 スレッド) を生成し、スレッド切り替えコンテキストでプロセッサをビジー状態に保ちます。
私の質問は次のとおりです。join_allの呼び出し後に、thread_group で create_thread を呼び出すことは可能ですか。
つまり、コードをこれに変更できますか?
これを経験した人は誰でも、洞察に感謝します。
c++ - 奇数の C++ メンバー関数宣言構文: && 修飾子
それらの二重アンパサンドは一体何ですか?「BS The C++ Langauge 3d edition」を調べましたが、説明が見つかりませんでした。
c++ - どのスレッドがメソッドを呼び出したかを知る方法
複数のスレッドから呼び出される threadSafe メソッドがあります。どのスレッドがそれを呼び出したかを知る方法はありますか?
c - シンティラとスレッドセーフ
Windows (Win32、C/C++) で Scintilla エディット コントロールを使用しています。コントロールは WndProc で作成されます。Boost.Thread で作成された 2 番目のスレッドがあります。これはスペル チェッカーとして機能し、スペルが間違っている単語を赤い波線でマークします。したがって、Scintilla コントロールの内容を変更する 2 つのスレッドがあります。
最初は、テキストの編集中にプログラムがクラッシュしていました。そこで、スレッドセーフについて Scintilla を調査しました。情報はほとんど見つかりませんでしたが、ドキュメントでこの引用を取得することができました:
別のスレッドから Scintilla ウィンドウのネイティブ スレッドに対して直接呼び出しを実行すると問題が発生します。この場合、SendMessage(hSciWnd, SCI_*, wParam, lParam) を使用してウィンドウのスレッドと同期する必要があります。
もちろん、私は直接呼び出しを使用しているので、スペル チェック スレッド内のすべての呼び出しを SendMessage に変更すると、プログラムがクラッシュしなくなりました。最後に、それが問題です。私は問題を解決しましたか、それとも Scintilla とマルチスレッドで他の癖に遭遇するのでしょうか?
c++ - boost::asio::deadline_timer はタイマーごとにスレッドを使用しますか?
さまざまな間隔で更新する必要があるアイテムのリストがあります。リストは、何千ものアイテムに成長する可能性があります。各項目の間隔が異なる可能性があります。アイテムごとに 1 つのタイマーを作成すると、システムがスレッドで飽和状態になりますか? 一連のアイテムの最小間隔に等しいタイマーを 1 つ作成し、更新のたびにカウンターをインクリメントしてから、カウンターが他の間隔と等しいかどうかを確認する方がよいのではないかと考えていました。最小間隔が他のすべての間隔の倍数である場合、これは機能するはずです。助言がありますか?
c++ - マルチスレッド MPI プロセスが突然終了する
Boost::thread を使用して MPI プロセスごとに 2 つのスレッドを生成する MPI プログラム (Visual Studio 2k8 + MSMPI) を作成していますが、追跡に問題があるという問題が発生しました。
でプログラムを実行すると: mpiexec -n 2 program.exe
、プロセスの1つが突然終了します:
最初のプロセスが突然終了する理由がわかりません。理由を突き止める方法もわかりません。これは、すべての操作の最後にランク 0 のプロセスを無限ループに入れた場合でも発生します... 突然停止します。私の主な機能は次のようになります。
master
関数とslave
関数が終了する前に任意の作業を行う場所。少なくとも、マスター スレッドがその操作の最後に達していることを確認できます。スレーブ スレッドは常に、実行が中止される前に完了していないスレッドです。print ステートメントを使用すると、スレーブ スレッドで実際にエラーが発生していないように見えます... 順調に進んでいて、クラッシュに巻き込まれただけです。
それで、誰かが次のことについて何か考えを持ってい
ますか? a) 何が原因でしょうか?
b) どのようにデバッグすればよいですか?
本当にありがとう!
編集:
マスター/スレーブ機能の最小限のバージョンを投稿します。このプログラムの目的は純粋にデモンストレーションを目的としていることに注意してください...そのため、何も役に立ちません。基本的に、マスター スレッドはダミー ペイロードを他の MPI プロセスのスレーブ スレッドに送信します。
c++ - 非スレッド化クラスからの C++ スレッド化クラスの設計
オーディオのエンコード/デコードを行うライブラリに取り組んでいます。エンコーダーは、利用可能な場合、複数のコア (boost ライブラリを使用する複数のスレッド) を使用できる必要があります。私が今持っているのは、すべてのエンコーディング関連の操作を実行するクラスです。
私が取りたい次のステップは、そのクラスをスレッド化することです。だから私はこれを行う方法を考えています。
スレッドクラスを作成し、n 個のコアに対して n 個のスレッドを作成し、適切な引数を使用してエンコーダーを呼び出すことを考えました。しかし、これはやり過ぎで、別のクラスは必要ないので、スレッド作成に「ユーザー インターフェイス」を利用します。
何か提案があることを願っています。
編集: CUDAを使用して入力データの統計を作成し、前処理に複数のスレッドを使用することを余儀なくされています。そのため、システムに複数のカードがある場合、それらを並行して使用する唯一の方法は、複数のスレッドを作成することです。
例: 4 つのファイル、4 つの異なる計算単位 (個別のメモリ、一意のデバイス ID)。各ファイルは、1 つの計算単位で実行されます。
私が今持っているものは次のとおりです。
したがって、main() からスレッド化されたワーカーを呼び出すのが最善の方法だと思います
スレッドクラスを実装しないでください。