問題タブ [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 投票する
8 に答える
34774 参照

c - pthread_create()の使用中に構造体を引数として渡す

pthread_create()次のようなものを使用しながら、4番目の引数として構造体を渡してみました。

これで、構造体の変数(ta、tb、またはtc)にアクセスしようとすると、エラーが発生し続けます。構造体または共用体ではないもののメンバーを要求します。

構造体をスレッドに渡すために使用できる代替メソッドは何ですか?

0 投票する
5 に答える
7553 参照

c++ - Openwrt Linux で -pthreads を使用して C++ をコンパイルすると、セグメンテーション エラーが発生します

私は C++ でのプログラミングにかなり慣れていないので、pthreads を使用しています。コードを OpenWRT 用にクロス コンパイルしていますが、ボードでプログラムを実行すると何らかの理由でセグメンテーション エラーが発生しますが、PC では正常に実行されます。小さな C プログラムを試してみたところ、問題なく動作したため、コンパイルのリンク段階でエラーが発生したと思われます。また、ファイルの名前を .cpp に変更して g++ でコンパイルしても機能します。

Eclipse コンパイラーからの出力:

編集: 古いコードを削除し、新しいより単純な例を追加しました。このコードは、C プログラムとしてコンパイルすると実行されますが、C++ プログラムとしてコンパイルすると実行されません。ボード上で 2.6.26.3 カーネルを実行しています。

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

c++ - pthread-win32 での VS rand() の問題

pthread プログラミングで奇妙な問題が発生しました。vs2005 でpthread-w32を使用して次のコードをコンパイルしました。

出力は次のようになります

rand() が 2 回の呼び出しごとに同じ結果を返すのと同じように、srand() がありますが、プログラムを実行するたびに結果は変わりません

私はマルチ スレッド プログラミングに非常に慣れていないので、rand() がスレッド セーフではないことを聞いたことがあります。しかし、上記のプログラムが間違っているのか、それとも rand() 関数に問題があるのか​​ 、まだわかりません。

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

c - pthread バリアを安全に破棄できるのはいつですか?

初期化された pthread_barrier_t がある場合、安全に破棄できるのはいつですか? 次の例は安全ですか?

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

linux - -pthreads で -D_REENTRANT が必要ですか?

Linux (カーネル 2.6.5) では、ビルド システムは gcc を-D_REENTRANT.

を使用する場合、これはまだ必要pthreadsですか?

gcc -pthreadオプションとの関係は?pthreads で使用する必要があることは理解しています-pthreadが、それでも必要-D_REENTRANTですか?

余談ですが、 gcc 3.3.3 と gcc 4.xx の間で REENTRANT を使用する際に知っている違いはありますか?

gcc オプションを使用すると、それが定義され-pthreadていることがわかります。_REENTRANTコマンドラインを省略-D_REENTRANTしても違いはありますか? たとえば、一部のオブジェクトがマルチスレッドのサポートなしでコンパイルされ、pthreads を使用するバイナリにリンクされて問題が発生する可能性がありますか?

使用するだけで問題ないと思います: g++ -pthread

静的ライブラリとリンクする複数の静的ライブラリとアプリケーションをコンパイルしています。ライブラリとアプリケーションの両方が pthread を使用します。

過去のある段階で必要だったと思いますが、まだ必要かどうかを知りたいです。グーグルで言及した最近の情報は返されていません - D_REENTRANTwith pthreads. kernel/gcc/pthreadの最近のバージョンでの使用について議論しているリンクまたは参考文献を教えていただけますか?

明確化: 現在、-D_REENTRANT と -lpthread を使用していますが、g++ -pthread だけで置き換えることができると思います。man gcc を見ると、プリプロセッサとリンカの両方のフラグが設定されています。何かご意見は?

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

c++ - C++-スレッドと複数のキュー

ワーカー(スレッドとして表される)と(複数の)キューのシステムを構築する必要があります。個々のジョブはキューの1つで待機しており、ワーカースレッドがそれらを処理するのを待機しています。各ワーカーは、一部のキューからのみジョブを処理できます。スピン待機はありません。C / C ++、pthread、標準POSIX。

私にとっての問題は、「複数のキュー」のことです。私はこれを単一のキューで実装する方法を知っています。ワーカーは、処理できるすべてのキューを待機する必要があります(いずれかのキューを待機します)。

WindowsではWaitForMultipleObjectsを使用しますが、これはマルチプラットフォームである必要があります。

このための特定のコードは必要ありません。使用するモデルのヒントまたは説明だけが必要です。前もって感謝します。

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