問題タブ [pthreads]

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.

0 投票する
1 に答える
8382 参照

linux - pthreads のナイスレベル?

組み込みシステム (glibc 2.6.1 を使用する ARM プロセッサ上の Linux カーネル 2.6.28) で、複数のスレッドで構成されるアプリケーションを実行しています。これらのスレッドの 1 つが他のスレッドよりも多くの CPU 時間を取得したいと考えています。

優先順位を設定するための 1 つのオプションは、 \ (または\ )と共にpthread\を使用することですが、これはスレッドに非常に多くの CPU を与えます (スレッドがスリープしない限り、まだ を使用している仲間のスレッドからすべての CPU を消費します)。_setschedparamSCHED_RRSCHED_FIFOSCHED_OTHER

もう 1 つのオプションは、スレッドのナイス レベルを設定することです。ただし、これはまさに私が探していたものですが (スレッドはもう少し CPU を取得しますが、他のスレッドを枯渇させることはできません)、正しく動作させることはできません。マニュアルページによると、「スレッドは共通のナイス値を共有していません」。これは、同じプロセスで個々のナイス値を異なるスレッドに設定できると解釈します。

これが私のコードです:

ただし、tid はすべてのスレッドで同じようです。また、スレッドの個々のナイス レベルを設定しても、 を呼び出したときに、すべてのスレッドで設定された最新のナイス レベルが返されますgetpriority。パフォーマンスからすると、これは一貫しています (つまり、同じタスクでスレッド A とスレッド B を実行し、次に A を -19 に設定し、B を 19 に設定すると、両方がほぼ同時に終了します)。

ただし、スレッド A を実行し、次にスレッドを -19 に設定し、次に B を実行し、+19 に設定すると、B がフル パワーで実行されます (A よりもはるかに早く終了します)。

そのため、スレッドは実行時に設定されたナイス レベルを使用し、後で変更する方法はないようです。

私は、より多くの情報やあらゆる種類の確認を求めて狂ったようにグーグルで検索しましたが、これまでに見つけたものはかなり曖昧です. Linux (2.6.28、glibc 2.6.1) でスレッドの適切なレベルがどのように処理されるかについて、ここに誰か説明がありますか? そして、すでに実行中のスレッドのナイスレベルを変更するにはどうすればよいでしょうか?

0 投票する
3 に答える
7249 参照

c - マスター/ワーカー スレッドとシグナル処理

マスター スレッドといくつかのワーカー スレッドを使用してプログラムを作成しており、シグナル処理を正しく行いたいと考えています。私の問題は次のとおりです。

マスタースレッドが開始し、すべての割り当てを行います

マスター スレッドが SIGINT シグナル ハンドラを設定する

マスター スレッドはワーカー スレッドを開始します。ワーカー スレッドは特別なクリーンアップを必要としませんが、システム コールまたはセマフォでスリープ状態になる可能性があります。

SIGINT が受信されると、それを受信するスレッドは 1 つだけであると理解しています。そのため、スレッドがシステム コールまたはセマフォでスリープしている場合、それらは起動されず、ワーカー スレッドに pthread_join できず、マスター スレッドで必要なすべてのクリーンアップを実行できません。

次のシグナル ハンドラーで問題を解決できますか?

私が期待しているのは、SIGINT を受信すると、すべてのスレッドが別のシグナルで通知され、ブロッキング呼び出しから抜け出し、g_do_cleanupフラグを確認して正常に終了することです。

これを適切に行う方法についてのコメントやリンクは大歓迎です。

編集:特定の条件で待機している複数のスレッドをウェイクアップする方法を探しているわけではないので、 pthread_cond_signal アプローチが探しているものではないと思います。私が欲しいのは:

  • ブロッキング呼び出しでブロックされたすべてのスレッドがこれらの呼び出しから戻る方法を見つけます。
  • または、メインのスレッドを除くすべてのスレッドを強制終了します。
0 投票する
1 に答える
5406 参照

events - pthread ベースのイベント 待機中のスレッドのみをウェイクアップする

私の C++ プログラムには、pthreads (Linux 上で実行) に基づくトリガーと待機メンバー関数を持つクラス CEvent があります。待機中のプロセスが 1 つある場合、実装は非常に明白です (つまり、オンラインで多くの例を参照)。ただし、複数のスレッドがイベントを待機しており、trigger() が呼び出されたときにすべて確実にウェイクアップする必要があるという要件を満たす必要があります。2 つ目の条件として、trigger() が呼び出されたときに待機していたスレッドのみが起動する必要があります。

私の現在のコード:

これは、wakeUp を false に戻す前に待機中のすべてのスレッドがウェイクアップする限り、ほとんど機能しているようです。ただし、ブロードキャストと wakeUp のリセットの間に、wait() を呼び出す他の (または同じ) スレッドもすぐにウェイクアップしますが、これは受け入れられません。ミューテキストのロック解除の前に wakeUp = false を配置すると、スレッドが起動しなくなります。

私の質問: * pthread_cond_broadcast はいつ返されますか? つまり、すべてのスレッドが起動した後にのみ戻るという保証がありますか、それとも前に戻ることができますか? * この問題に対する推奨される解決策はありますか?

0 投票する
2 に答える
8429 参照

multithreading - pthread での gprof の使用

pthreads を使用するマルチスレッド プログラムのプロファイリングに gprof を使用できますか? つまり、その出力には、すべてのスレッドで使用された時間が含まれますか?

0 投票する
8 に答える
24740 参照

c++ - イベント/タスク キュー マルチスレッド C++

複数のスレッドからメソッドを呼び出せるクラスを作成したいと考えています。ただし、メソッドが呼び出されたスレッドでメソッドを実行するのではなく、独自のスレッドですべてを実行する必要があります。結果を返す必要はなく、呼び出し元のスレッドをブロックするべきではありません。

私が以下に含めた最初の試みの実装。パブリック メソッドは、関数ポインターとデータをジョブ キューに挿入し、ワーカー スレッドがそれを取得します。ただし、これは特に優れたコードではなく、新しいメソッドを追加するのは面倒です。

理想的には、これを基本クラスとして使用して、手間とコードの重複を最小限に抑えて (可変数の引数を使用して) メソッドを簡単に追加できるようにしたいと考えています。

これを行うためのより良い方法は何ですか? 同様のことを行う既存のコードはありますか? ありがとう

0 投票する
6 に答える
20185 参照

multithreading - 並列化:pthreadまたはOpenMP?

科学計算のほとんどの人は、共有メモリの並列化に関して、準標準としてOpenMPを使用しています。

pthread上でOpenMPを使用する理由(読みやすさ以外)はありますか?後者はより基本的なようであり、最適化する方が速くて簡単かもしれないと思います。

0 投票する
2 に答える
2497 参照

c++ - pthreads はコンパイルしますが、バイナリは作成されません

pthreads を使用する代入のために C++ で作成したプログラムをコンパイルしようとしています。Linux で Eclipse を使用していますが、コンパイラの引数 (g++、gcc、リンカー) に「-lpthread」を追加した後、コンパイルに問題はありませんでした。しかし、実行してデバッグしようとすると、Eclipse から「起動に失敗しました。バイナリが見つかりません」というエラー メッセージ ウィンドウが表示されました。

gcc と g++ を使用して、サフィックス -pthread と -lpthread を付けて手動でコンパイルしようとしましたが、「gcc: –pthread: No such file or directory」という結果になりました。

問題なくコンパイルされ、exeが生成されないため、何が問題なのかわかりません。何かを適切に取得する必要があるかもしれないと思います。

私がすべきことはありますか?

0 投票する
3 に答える
28023 参照

c - Pthread-time.h :: sleep()とpthread.h :: pthread_yield()の違いは何ですか?

time.h :: sleep()とpthread.h :: pthread_yield()の違いに関する情報を探すのにかなり長い時間を費やしましたが、確かな参考資料が見つからなかったため、この質問を投稿しています。

time.h :: sleep()とpthread.h :: pthread_yield()の違いは何ですか?

アップデート:

私が尋ねる理由は、私がsleep()を使用して個々のスレッドをsleep()していたためです...そして、8つのスレッドと4つのスレッドがあるときに、アプリケーションで問題が発生し始めました。オンラインでsleep()が各スレッドにのみ影響するかどうかを確認したところ、Sleep()がプロセス全体に影響するのか、sleep()が個々のスレッドにのみ影響するのかを示す適切なリファレンスが見つかりませんでした。

0 投票する
2 に答える
21967 参照

c++ - pthread_mutex_lockのセグメンテーション違反

やろうとするとセグメンテーション違反が発生します

これは本当に奇妙なことです。何が原因なのかわかりません。コンストラクターで_mutexを初期化しました

私にできることは何ですか?

0 投票する
1 に答える
2176 参照

c++ - pthread_setspecificおよびpthread_getspecificを使用して、std::mapインスタンスへのポインターを格納します

失敗したLDAP検索を追跡するために、スレッド固有のキャッシュとしてマップを使用しています。マップを動的に割り当て、pthread_setspecificを使用してポインターを格納します。キャッシュをチェックしたり、失敗数を増やしたりするときは、pthred_getspecificを使用して、void *ポインターを取得し、ポインターをマップタイプにstatic_castします。[]演算子を使用したマップの呼び出しは、マップの状態に影響を与えないようであり、map-> size()の呼び出しは常に0を返します。おそらくpthread_getspecificを誤って使用しているように感じますが、私が行った例から私のコードを見て、正しく見えます。

コード:


テストコード:


テストコード出力: