問題タブ [pthread-join]
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++ - pthread_join() はどのようなシグナルを引き起こす可能性がありますか?
C++ で、pthread_join() の呼び出しで簡単に再現できないエラー状態が発生しました。何らかのシグナルが生成されました。どのシグナルかはわかりませんが、シグナル ハンドラーが呼び出され、何らかの理由で通常のデバッグ情報が出力されませんでした。生成された信号について。次のようなスタック トレースを取得しました。
pthread_join() の man ページを確認しましたが、シグナルについての言及はありませんでした。
生成された信号とその原因は何ですか? これはある種の競合状態である可能性があります。
c - Cpthreadは終了したスレッドに参加します
FIFOを介して通信する2つのプログラム(クライアント/サーバー)を構築しています。どちらのプログラムにもスレッドがあります。クライアントのスレッドが終了すると、スレッドは結合されず、メインがハングします。
プログラムは次のことを行います。
サーバ:
- main:FIFO1から読み取ります
- main:リクエストを処理するスレッドを作成します。
- メイン:goto 1
- スレッド:リクエストを処理します
- スレッド:FIFO2に応答を送信します
- スレッド:終了
クライアント:
- メイン:スポーンスレッド
- スレッド:FIFO2からクライアントへのX応答を読み取ります
- スレッド:終了
- main:XリクエストをFIFO1に送信します
- main:スレッドが終了するのを待つ
- メイン:応答を確認する
サーバーは正常に動作し、それに応じてすべてのスレッドが結合されます。
クライアントはステップ5で失敗します。
メインが永遠にぶら下がっています。確認しましたが、スレッドはすでに終了しています。
使用する
私は得る
エラーコード=16
strerrorは与える
デバイスまたはリソースがビジー
スレッドの作成:
または、pthread_create(&reader、NULL、trataResp、NULL);を使用します。
変化はありません。
どうすればこれを解決できますか?
c++ - pthread 入力スレッドとワーカー スレッドの同期
私は 2 つの pthread を持っています。そのうちの 1 つは cin から読み取って QUEUE に入れ、もう 1 つは 2 秒ごとに QUEUE をチェックし、何かがある場合は何かを出力するワーカー スレッドです。
これは私の主なものです:
Thread.h と Thread.cpp は次の場所にあります。
Mutex.h と Mutex.cpp:
問題は、iread スレッドで stdin を待機している無限ループに入ると、rq スレッドが開始されないことです。実際、 .start() が最初に来るものは、それが行き詰まるものです...何かアイデアはありますか?
multithreading - マルチスレッドプログラミングで「ロック」を使用する必要があるのはいつですか?
マルチスレッドプログラミングで「ロック」を使用する必要があるのはいつですか?各スレッドが変更する領域をロックするか、変更されない場合でも各スレッドがアクセスできる領域をロックしますか?
ご清聴ありがとうございました。時間があれば、実際のコードの詳細をご覧ください。
multithreading - gdbの詳細は何ですか、1つのスレッドを保持しますか?
gdbの詳細は何ですか?コードをデバッグするときに1つのスレッドを保持しますか?
メインスレッドに終了フラグを設定し、フラグを出力する前に他のスレッドに参加しました。引数「-g」を使用してコンパイルした後、gdbを使用してデバッグバージョンを実行すると、次のようになります。
GDBは、スレッドの「作成」と「終了」に関する情報を提供します。pthread_join()
ただし、メインスレッドで「メイン出口」を呼び出して出力した後は、常に1つのスレッドが終了します。なんで?gdbが動作するスレッドはありますか?
リリース版を実行します。特別なことは何もありません。
c - C で複数のスレッドから値を受け取る
このプログラムでは、pthread_join での最初の呼び出し後にセグメンテーション違反が発生しています。最初のファイルを渡すとき、メインで適切なサイズを取得しています。しかし、2 番目のファイルの呼び出し中に、セグメンテーション違反が発生します。gdb を使用すると、malloc にもかかわらず「**size[1] と **size[2] が NULL になっています。しかし、メインの開始時に、メモリの割り当て中にエラー メッセージが表示されません。つまり、メモリは最初に割り当てられています。どうすればよいか教えてください。
c - Cでpthread_joinを使用してスレッド数を制御するには?
テキスト ファイルから 20000 個の文字列を読み取り、それを他のプログラムに送信する C プログラムを作成しました。このテキスト ファイルをループし、そのテキストを他のプログラムに送信するスレッドを作成するためにしばらく使用しました。しかし、4つのスレッドだけが機能するようにします。そのため、カウンターを使用してデクリメントし続け、カウンターをチェックする if 条件を使用して、カウンターが 1 に設定されると、前のスレッドに対して pthread_join を呼び出しました。最初にこれら 4 つのスレッドを終了し、次に新しい 4 つのスレッドを終了して、新しいテキスト ファイルの文字列を取得します。しかし、必要に応じて機能していません。4 スレッドごとに 4 回だけ処理します。テキスト ファイルからすべてのレコードを取得するわけではありません。
プログラム:-
入力テキスト ファイルの内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
出力は次のとおりです。
欲求出力:-
システムで作成するスレッドは 4 つだけです。それ以上ではありません。
c++ - Pthreads、pthread_join(pthread_t, void**) との混同
なぜ do が戻り値のpthread_join
2 番目の引数としてとられるvoid**
のに対しpthread_exit
、戻り値が与えられた には戻り値の引数が として含まれているのか理解できませんvoid*
。
c - 構造体を返す pthread_exit の問題
私は構造体を持っています
私のスレッド関数では
そして、私はすることによって受け取ろうとします
私が受け取る値は毎回変です。スレッドで作成した値を受け取る方法について混乱しています。Cでスレッドを学習しようとしていて、それを把握したようですが、値を返すことができません。方法はありますか?誰の助けにも感謝します。
perl - スレッドの結合に関する問題
Perl スクリプトの一部に問題があり、何日も悩まされています。目的を要約すると、大きなファイルをチャンクで読み込み、入力ストリームに対して何らかの操作を行うことです (私の質問には関係ありません)。最初に実装したとき、ファイルをループしてから、次のようにいくつかのことを行いました。
残念ながら、ファイルは非常に大きく、操作は多くの関数呼び出しで複雑であるため、これによりメモリが着実に増加し、perl がメモリを割り当てることができなくなり、スクリプトが失敗しました。そのため、いくつかの調査を行い、メモリ オーバーヘッドを最小限に抑えるためにいくつかのことを試みました (ループ外で変数を定義する、undef に設定するなど)。これにより、割り当てられたメモリ サイズの増加が遅くなりましたが、最終的には失敗しました。(そして、私が正しく理解していれば、perl が OS にメモリを返すのは sth です。実際には起こりません。)
そこで、関数呼び出しとそのすべての定義をサブスレッドにネストし、その終了を待って結合し、次のチャンクでスレッドを再度呼び出すことにしました。
スレッドが参加するなら、これは解決策だったかもしれません! しかし、実際にはそうではありません。$thr->detach(); で実行すると 同時に何百ものスレッドを取得することを除いて、すべてが正常に機能しますが、これは良い考えではありません。この場合、それらを連続して実行する必要があります。
そのため、この結合の問題について調査を行ったところ、perl 5.16.1 に問題がある可能性があるという声があったため、5.16.2 に更新しましたが、それでも結合しません。メーリングリストのどこかで、スレッドを CPAN モジュール Thread::Queue に参加させることに成功した誰かから読んだことを覚えていませんが、これも私にはうまくいきませんでした。
だから私はスレッドをあきらめて、このことをフォークしようとしました。しかし、フォークでは、「フォーク」の総数が制限されているように見えますか? とにかく、13 回目から 20 回目の繰り返しまではうまくいき、それ以上分岐できないというメッセージであきらめました。
CPAN モジュールの Parallel::ForkManager と Proc::Fork でも試してみましたが、役に立ちませんでした。
だから今、私はどういうわけか立ち往生していて、自分自身を助けることができません. たぶん他の誰かができます!どんな提案でも大歓迎です!
- これをスレッドまたは子プロセスで動作させるにはどうすればよいですか?
- または、少なくともどうすれば perl に強制的にメモリを解放させて、同じプロセスでこれを行うことができますか?
私のシステムに関するいくつかの追加情報: OS: Windows 7 64bit / Ubuntu Server 12.10 Perl on Windows: Strawberry Perl 5.16.2 64bit
Stackoverflow に関する私の最初の投稿の 1 つ。私はそれを正しくやったと思います:-)