問題タブ [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.
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 つの関数で同じロックを取得すると、デッドロックや競合状態が発生しますか?
編集:私は今これを自分のプログラムで使用していますが、正常に動作します。運が良かっただけなのかよくわからない
c++ - pthreadは251を返します
pthread_createは、スレッドを作成せずに値251を返します。誰かが問題が何であるか知っていますか?助けてください。マシンはHP-UXです。
マルチスレッドは初めてです。
opengl - 異なるスレッドからopenglグラフィックを描画する方法は?
3Dグラフィックスとコマンドラインを表示するopenglアプリケーションを作成したいと思います。どちらも重いプロセスなので、別々のスレッドにしたいです。2つの異なるビューポートでこれにアプローチできると思いましたが、openglでスレッドを処理する方法を知りたいです。
私が読んでいることによると、Openglは非同期であり、異なるスレッドからその関数を呼び出すことは非常に問題になる可能性があります。この問題に取り組むために使用できる方法はありますか?理想的には、透明感のある効果を使用して3Dグラフィックスの上にコマンドラインを描画したいと思います...(これは私が推測するビューポートでは不可能です)
ソリューションが移植可能であることが重要です。
ありがとう!
c - スレッドのメモリ使用量を知るには?
特定のphtreadスレッドによって使用されているメモリの量を知ることは可能ですか? VmRSS のような情報に興味があります。
c - スレッドごとのメモリ割り当て
私はマルチスレッドアプリケーション用のトレースツール、特にメモリ割り当てに取り組んでいます。
スレッドごとのメモリ割り当てが欲しいのですが。スレッドがmallocを実行する場合、使用されるメモリはグローバルヒープであることを私は知っています。どのスレッドがどのくらいのメモリを割り当てたかを追跡したいと思います。
私はmallocにラッパーを作成し、mallocが存在するたびに次のように値をインクリメントしました。
それはうまくいきます。問題は、free
解放されたメモリの量を返さないメソッドにあります。
私の解決策を考慮に入れないでください、それは私が試したことを示すためだけです。
編集:
上で述べたように、私自身のテーブルを維持することはあまりにも重い方法です。