問題タブ [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_cancel を使用したときに pthread_join の可能な戻り値は何ですか?
start_routine
次のコードは、 が時間内に完了しない場合にスレッドをキャンセルし、スレッドにts
参加してスレッドが確実に終了するようにすることを示しています。これを単純な関数 for start_routine
and res2
returnsで使用しましたPTHREAD_CANCELED
。ただし、サードパーティのライブラリを呼び出すためにこのアプローチを使用しようとしましたstart_routine
が、返されませんPTHREAD_CANCELED
(つまり、「xxx が原因で pthread が終了しましたか?」というメッセージが表示されました)。
のマンページによるとpthread_join
:
ターゲット スレッドがキャンセルされた場合、PTHREAD_CANCELED が *retval に配置されます。
pthread_join
を使用した場合に返される可能性のある値は何pthread_cancel
ですか? なぜpthread_join
時々返さないのPTHREAD_CANCELED
ですか?
PTHREAD_CANCEL_DEFERRED
デフォルトのキャンセル タイプ (つまり) とキャンセルを有効にする (つまり)を使用したことに注意してくださいPTHREAD_CANCEL_ENABLE
。
c++ - pthread_exit が pthread_join のように機能するのはなぜですか?
コード:
なぜpthread_exit(NULL)
ここでのように振る舞うのpthread_join()
ですか?つまりmain
、スレッドを破棄せずに終了printHello
して続行できるのはなぜですか?
multithreading - 共有変数に関するこの単純なプログラムがスケーリングしないのはなぜですか? (ロックなし)
私は並行プログラミングが初めてです。CPU を集中的に使用する作業を実装し、どれだけ高速化できるかを測定します。ただし、#threads を増やしても速度が向上しません。
プログラムは次のタスクを実行します。
- 1 から 1000001 までカウントする共有カウンターがあります。
- カウンターが 1000001 に達するまで、各スレッドは次のことを行います。
- カウンターをアトミックにインクリメントし、次に
- ループを 10000 回実行します。
合計で 1000001*10000 = 10^10 の操作を実行する必要があるため、#threads をインクリメントすると高速化されるはずです。
実装方法は次のとおりです。
ただし、プログラムを実行すると、順次実行よりもパフォーマンスが向上することはありません!!
4 コア マシンでプログラムを実行します。
プログラムを改善するための提案はありますか? または、スピードアップできない理由の手がかりはありますか?
c - すべてのスレッドの実行を保証する
同じメソッドを呼び出す 4 つの異なるスレッドを実行したいのですが、すべての実行が別の実行中のスレッドからのものであることを確認したいと考えています。
以下に示すコードでは、メソッド関数は予想される回数実行されますが、常に同じスレッドによって実行されます (出力される値は変更されません)。
この条件を保証するには、コードで何を変更する必要がありますか? (この例では、4 つの異なる値が出力されます)
編集:同じコードですが、ソリューションがどのようになるかを確認するための構造が含まれています
linux - pthread_exit からの終了値が正しくありません
以下のコードは単純に 2 つのスレッドを作成し、それらの戻り値を取得しようとします。
コンパイルして 32 ビット glibc-2.15 システムで実行したところ、すべてうまくいきました (出力: r1: 1、r2: 2)。しかし、64 ビットの glibc-2.17 システムで同じことを行ったところ、出力が間違っていました (出力: r1: 0、r2: 2)。同じコードが異なるシステムで異なる動作をするのはなぜですか?
注: r1 と r2 のタイプが に変更された場合、void*
以下int*
のコメントのように、コードは両方のシステムで機能します。