問題タブ [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++ - C++ スレッドに関する質問 - スレッドが終了したことを示す値を設定する
以下は安全ですか?
私はスレッド化が初めてで、時間のかかるプロセスを C++ プログラムの別のスレッドに委譲したいと考えています。ブースト ライブラリを使用して、次のようなコードを記述しました。
thrd = new boost::thread(boost::bind(&myclass::mymethod, this, &finished_flag);
finished_flag は私のクラスのブール値のメンバーです。スレッドが終了すると、値が設定され、プログラムのメイン ループがその値の変更をチェックします。私は 1 つのスレッドしか開始しないため、これで問題ないと思います。値を変更するのはそのスレッドだけです (スレッドを開始する前に初期化される場合を除く)。ロックやミューテックスなどを使用する必要がある
c++ - ブロックされた Boost::Thread を強制終了する
two からの入力をブロックするアプリケーションを作成していますistreams
。
どちらからistream
の読み取りも同期 (ブロッキング) 呼び出しであるため、Boost::thread
読み取りを行うために 2 つの を作成することにしました。
これらのスレッドのいずれかが (受信した入力に基づいて) 「終了」に達することができ、「終了」に達すると、両方の入力ストリームの受信が停止します。残念ながら、どちらがそうするかはわかりません。
したがって、join()
実際に返される (ブロック解除される) スレッドは 1 つだけ (どのスレッドかを事前に決定することはできません) であるため、両方のスレッドを使用することはできません。
どうにかしてもう一方を強制的に終了させる必要がありますが、入力を待ってブロックされているため、戻る時間だと判断できません(条件変数かどうか)。
次のいずれかへの方法はありますか?
- boost::thread にシグナルを送信する、または
- 強制的
istream
に「失敗」させる、または - Boost::thread を殺す?
ノート:
- その一つ
istreams
がcin
- プロセスを再起動しようとしているため、リセットを禁止する方法で入力ストリームを閉じることはできません。
編集:
- 「終わり」に達したとき、どのスレッドが正常に終了したか、どのスレッドを強制終了する必要があるかを知っています。それは私が理解する必要がある殺害です(またはistreamから読み取るための別の戦略)。
- 終了して適切にクリーンアップするには、両方のスレッドが必要です:(
ありがとう!
c++ - ブースト ライブラリを使用して vc6 でマルチスレッド アプリケーションを作成しますか?
ブースト ライブラリを使用して VC6 でマルチスレッド アプリケーションを作成することは可能ですか? 可能であれば、関連するチュートリアルは何ですか。
c++ - DLL で使用すると Boost Spirit がクラッシュする
アプリケーションで Boost.Spirit および Boost.Thread ライブラリを使用しているときにクラッシュが発生しました。これは、メイン スレッドからのプロセスの有効期間中に Spirit パーサーを使用した場合にのみ発生します。
クラッシュは終了時に発生し、Spirit パーサーによって割り当てられたスレッド固有のストレージのクリーンアップに関連しているようです。スレッド固有のメモリが既にアンロードされている DLL 内に割り当てられているため、DLL がアンロードされる順序が原因でクラッシュしている可能性があります。ただし、Boost.Thread DLL は、アプリケーション自体が終了するまでアンロードされません。
プロセス デタッチ通知を受け取ったときに、Spirit にスレッド固有のストレージ (たとえば、dll-main 内) を強制的に消去させる方法はありますか?
解決策/ヒントをいただければ幸いです。
PS!私のプラットフォームと設定:
- ビジュアル スタジオ 2005
- BOOST_ALL_DYN_LINK
- BOOST_SPIRIT_THREADSAFE
c++ - boost ライブラリを使用したマルチスレッド
関数を同時に複数回呼び出したい。スレッドを使用して、マシンの機能を最大限に活用する関数を呼び出したいと考えています。これは 8 コアのマシンで、私の要件はマシンの CPU を 10% から 100% 以上使用することです。
私の要件は、ブーストクラスを使用することです。ブースト スレッドまたはスレッドプール ライブラリを使用してこれを達成する方法はありますか? またはそれを行う他の方法はありますか?
また、毎回異なるパラメーターを使用して (別々のスレッドで) 複数の関数を呼び出す必要がある場合、これを行う最善の方法は何ですか? [ブーストを使用するか、ブーストを使用しないか]そしてどのように?
上記は機能していませんが、その理由はわかりませんか? :-(
multithreading - boost::thread: 最適化されたバージョンの実行時の Segfault
私は仕事に行くのに苦労してboost:thread
います。最適化なしでコンパイルすると問題なく動作します。
しかし、最適化でコンパイルされたバージョンはクラッシュします
何が原因か誰か知っていますか?
私が使用しているコードは次のとおりです。
PS: ubuntu Linux でブースト 1.32 を使用しています。
アップデート:
デバッガーでクラッシュする場所は次のとおりです (37 行目はthread_2.join();
元のコードの 1 つです)。
ここに私の実際の2つの機能があります:
助けてくれてありがとう!
synchronization - ブーストで状態変化をポーリングするときにスレッドを同期する方法
私のアプリケーションでは、別のアプリケーションが開始または停止されたことをイベントで通知したいと考えています。私は実行中のアプリケーションに既存の API を持っていますが、これは明らかな解決策である通知に対応するために変更することはできません。
私が持っているのは API の関数呼び出し (isRunning) であるため、API を介して状態をポーリングし、アプリに通知するポーリング スレッドを作成することにしました。
私の問題は、ポーリング スレッドでの API 呼び出しが、自分のアプリケーションのメイン スレッドでも使用されているオブジェクトを使用していることです。それを確実に正しく行う方法を知りたいです :)。
私のアイデアは、API オブジェクトへの各呼び出しを (アダプターを介して、たとえば 2 番目のコード ブロックを参照) ミューテックス ロックでラップすることです。そのため、API が私のスレッドによって複数回呼び出されることはないと確信しています。
これは正しいアプローチですか?
スレッド化/同期にブーストを使用しています (コードを参照)。
これはポーリング スレッドです。
これらは、メイン スレッドからのいくつかの API 呼び出しです。
c++ - tr1::hash for boost::thread::id?
プレーンな (ツリーベースの) STL に対するアクセスを高速化するために、名前空間のunordered_set
クラスを使用し始めました。しかし、boost() にスレッド ID への参照を格納したかったのですが、これらの識別子の API が非常に不透明であるため、そのハッシュを明確に取得できないことに気付きました。tr1
map
boost::thread::id
驚くべきことに、boost はtr1
(hash
およびを含むunordered_set
) の一部を実装していますが、スレッド ID をハッシュできるハッシュ クラスを定義していません。
のドキュメントを見ると、boost::thread::id
スレッド ID をストリームに出力できることがわかったので、ハッシュを行うための私の解決策は次のようなものでした。
つまり、シリアル化し、結果の文字列にハッシュを適用します。ただし、これは実際に STL を使用するよりも効率が悪いようmap<boost::thread::id>
です。
だから、私の質問:これを行うためのより良い方法を見つけますか?hash<boost::thread::id>
クラスの存在を強制しないのは、boost と tr1 の両方で明らかな矛盾ですか?
ありがとう。
c++ - アプリケーションに渡されるスレッド数が異なる関数の呼び出し
毎回異なる数のスレッドで呼び出す必要がある関数があります (パフォーマンスの計算を行っているため、パフォーマンスがいつ低下し始めるかを知る必要があります)。以下に例を示します。
ここで、nThreads: コマンド ラインで指定された値
私の質問は、プログラムが for ループにアクセスするたびに「nThreads」を使用して「getTime」関数を呼び出すので、これは望ましい結果をもたらすでしょうか? または、同じことを見つけるために他の方法が必要ですか?
私が本当にやりたいことはこれです:
(上記のどれが正しいかはわかりません。)
getTime() 関数は、指定された行数で実行されます。これをテキスト ファイルから取得し、各行を API に渡します。API のパフォーマンスを計算します。しかし、これは私が持っている質問とは関係ありません。
毎回異なる数のスレッドで関数を呼び出し、各スレッドが完了するまでにかかった時間を計算したいと考えています。1 つのスレッドでかかった合計時間、2 つのスレッドが終了するのにかかった合計時間など。
c++ - ブースト shared_mutex の例 (複数の読み取り/1 つの書き込み)?
一部のデータを頻繁に読み取る必要があるマルチスレッド アプリがあり、そのデータが時々更新されます。現在、ミューテックスはそのデータへのアクセスを安全に保ちますが、複数のスレッドが同時に読み取れるようにし、更新が必要な場合にのみロックアウトできるようにするため、高価です (更新スレッドは他のスレッドが終了するのを待つことができます)。 .
これが本来あるべきことだと思いますがboost::shared_mutex
、使い方がよくわからず、明確な例も見つかりませんでした。
始めるために使用できる簡単な例はありますか?