問題タブ [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.
c - pthreadedプログラムをMPIに変換しますか?
マルチスレッドプログラムとマシン間通信に依存するプログラムの違いを理解しています。私の問題は、「C」で書かれた素晴らしいマルチスレッドプログラムがあり、8コアマシンで非常にうまく機能することです。より多くのコアにアクセスするために、このプログラムをクラスターに移植する機会があります。pthreadのものを取り除いてMPI(私が使用したことのないもの)を改造することは努力する価値がありますか、それともすべて(またはそのほとんど)を最初から再コーディングする方が良いですか?私たちがCに「行き詰まっている」ので、言語を大幅に変更することはできません。
c - C プログラムのコンパイル時のエラー
セマフォを使用する学校向けのプロジェクトを完成させようとしています。適切なヘッダー ファイル (および pthread 用の 1 つ) を含めました。コンパイラに適切なライブラリも指定しました。これは C で書かれています。はい、これは割り当てですが、私は実装の助けを求めているのではなく、この忌まわしいコンパイル エラーを理解できないようです。
私のコードの 47 行目から 50 行目は、セマフォの「単純な」宣言と初期化です。
48 行目でコンパイルしようとしたときに表示されるメッセージは次のとおりです。50 行目でも同じセットが得られますが、簡潔にするために投稿しませんでした。
これらはすべて main() 関数の外で宣言しました。これらのエラーを解決するにはどうすればよいですか? sem_t のデータ型がないことを示しているように見えるので困惑していますが、semaphore.h で定義されており、これを含めました。gccを使用しているUbuntuでCode::Blocksを使用してこれをコンパイルしています。このエラーは、コマンド ラインからコンパイルしても発生します。
助けてくれてありがとう。
c - pthread_cond_timedwaitがすぐに戻る
奇妙な問題があります。私は次のコードを持っています:
dbg
gettimeofday
すべての行の前に呼び出し、行の前に時間を追加します。その結果、次の出力が得られます。
ご覧のとおり、2つのデバッグ行の間を通過したのはわずか7マイクロ秒ですが、pthread_cond_timedwait
返されETIMEDOUT
ます。これはどのように起こりますか?cond変数を初期化するときに、時計を別のものに設定しようとしました。
(エラーメッセージは印刷されません)。CLOCK_REALTIME
との両方を試しましCLOCK_MONOTONIC
た。
このコードはブロッキングキューの一部です。5秒以内にこのキューに何も入れられない場合、何か他のことが起こるような機能が必要です。を使用しない場合、ブロッキングキューは正常に機能するため、ミューテックスと条件は両方とも初期化されますpthread_cond_timedwait
。
multithreading - クリティカル セクションでの (p) スレッドのキャンセル
時々キャンセルされる複数のスレッドを実行するアプリケーションがあります。これらのスレッドは、リソース (ソケット) に内部的にアクセスする別のオブジェクトを呼び出す場合があります。リソースが同時にアクセスされるのを防ぐために、実行時に何らかの順序を取得するためのクリティカル セクションがあります。
ここで、スレッドをキャンセルすると、スレッドがクリティカル セクションによってブロックされているコード内にあることが (時々) 発生します。クリティカル セクションはオブジェクトを使用してロックされており、スレッドのキャンセル時にこのオブジェクトが破棄され、その結果ロックが解除されることを期待していました。ただし、これは当てはまらないようで、スレッドの破棄時にこのリソース オブジェクトは永久にロックされます。
リソース オブジェクトを変更することはおそらくオプションではありません (サード パーティが提供)。さらに、並列で使用できないリソースへの同時アクセスを防止することは理にかなっています。
セクションがロック/ロック解除されているときに pthread_setcancelstate を使用してスレッドがキャンセルされないように実験しましたが、これは少し汚れているように感じ、他の状況 (たとえば、買収されたミューテックスなど) の最終的な解決策にはなりません。
好ましい解決策は、pthread_cancel を使用せず、代わりにスレッドにフラグを設定することであり、準備ができたときに (クリーンな方法で) スレッド自体をキャンセルすることを私は知っています。しかし、私はスレッドをできるだけ早くキャンセルしたいので、それを行う他のオプションがあるかどうか疑問に思っていました.
c++ - Linux 2.6 で C++ から SPID を取得する方法
質問があります: Linux 2.6 の SPID を C++ アプリケーションから取得する方法はありますか? 「ps -amT」を実行すると、プロセス内のスレッドが表示されます。
そして、ファイルシステムでスレッドを確認できます:
アプリケーションから SPID を取得して、実行中の各スレッドで SPID を特定する方法はありますか?
ありがとう!
/マイク
編集: getpid() から返される PID は各スレッドで同じであることを追加する必要があります。
このコードをスレッドに追加すると:
私はこの結果を得ます:
どちらも、ps または proc ファイルシステムで指定された SPID のようには見えません。
また、 gettid は SPID を返さないことに注意してください。
c++ - C++ スレッドが終了しても、メモリは割り当てられたままになりますか?
Linux で pthread ライブラリを使用しています。
スレッド A で文字列を割り当て、スレッド B で文字列を出力しようとしています。ただし、文字列は空で出力されます (スレッド A で動作することを確認しました)。
注:文字列はオブジェクト内に存在します。これは、クリーンアップされているか、空で再インスタンス化されている可能性があります...コンテナオブジェクトは、セグフォルトなどを与えません。すべての値が空です。
これは、スレッドが他のスレッドからメモリにアクセスできないためですか、またはスレッド A が停止するとメモリが割り当てられていないためですか? それともどちらでもありません。私のコードのバグかもしれませんが、これを除外したかっただけです...
アップデート:
メモリの問題であることが判明しました。あなたの答えのおかげで、私もこれに自分で答えました。同意/同意しない場合は、私の答えにコメントしてください。
c++ - pthread を使用して複数のコアを利用する際の問題
SDL と Pthread を使用して C++ でレイ トレーサーを開発しています。プログラムで 2 つのコアを使用する際に問題が発生しています。スレッドは機能しますが、両方のコアを 100% 使用していません。SDL とのインターフェイスとして、SDL_Surface.pixels のメモリに直接書き込むので、SDL によってロックされることはないと思います。
私のスレッド関数は次のようになります。
注: scene->renderPixel は const であるため、両方のスレッドが同じメモリから読み取ることができると想定しています。これを行う2つのワーカースレッドがあり、メインループでこれらを使用して動作させます:
注:スレッドを同期する代わりに、スレッドを作成して参加することも試みました。これを「-lpthread -D_POSIX_PTHREAD_SEMANTICS -pthread」でコンパイルすると、gcc は文句を言いません。
私の問題は、実行中の CPU 使用率のグラフを使用して最もよく説明されています:
(ソース: jopsen.dk )
グラフからわかるように、私のプログラムは一度に 1 つのコアしか使用せず、時々 2 つのコアを切り替えますが、両方を 100% 駆動することはありません。私はいったい何を間違えたのでしょうか?シーンでミューテックスやセマフォを使用していません。バグを見つけるにはどうすればよいですか?
また、scene->renderPixel() の周りに while(true) を配置すると、両方のコアを 100% にプッシュできます。したがって、これはオーバーヘッドが原因ではないかと疑っていますが、複雑なシーンを考えると、0.5 秒ごと (たとえば FPS: 0.5) だけ同期します。私のバグが何であるかを伝えるのは簡単ではないかもしれませんが、これをデバッグするアプローチも素晴らしいでしょう...私は以前にpthreadsで遊んだことがありません...
また、これはハードウェアまたはカーネルの問題である可能性があります。私のカーネルは次のとおりです。
ノート:
c++ - 構造体での pthread 条件待機の使用
以前、pthread_join を使用せずに 2 つのスレッドを同期することについて問い合わせましたが、pthread_cond_wait と pthread_cond_signal を使用して解決できました。この機能を 1 つの場所にまとめる小さな構造体を作成しました。
2 つの異なるスレッドから Wait() と Signal() を呼び出すと仮定すると、これはスレッド セーフになります。同じオブジェクトの 2 つの関数で同じロックを取得すると、デッドロックや競合状態が発生しますか?
編集:私は今これを自分のプログラムで使用していますが、正常に動作します。運が良かっただけなのかよくわからない