問題タブ [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 - MSVC / Windowsの「pthread_rwlock_timedrdlock()」および「pthread_rwlock_timedwrlock()」に相当します
Windows(MSVC)でPOSIXタイミングリーダー/ライターロックを実行するのと同じことは何ですか?
- pthread_rwlock_timedrdlock()
- pthread_rwlock_timedwrlock()
c++ - PThreadは、マルチプラットフォームC / C ++マルチスレッドプログラムに適していますか?
過去5年間、主にJavaと.NETの断片化を行っており、その間、重要なCまたはC++を記述していません。だからしばらくの間そのシーンから離れていた。
マルチスレッドを実行し、Windows、Mac OS X、およびLinux / Unix間でソースコードを移植できるCまたはC++プログラムを今日作成したい場合、PThreadは良い選択ですか?
CまたはC++コードはGUIを実行しないため、そのいずれについても心配する必要はありません。
ただし、Windowsプラットフォームの場合、UNIXエミュレーションランタイムライブラリの観点から、多くのUnixの手荷物を持ち込みたくありません。既存のWindowsスレッドAPIよりも可能な限り薄いラッパーであるWindows用のPThreadAPIを優先します。
補遺編集:
boost:threadを使用する傾向があります-C++のtry/catch例外処理も使用できるようにしたいと考えています。そして、私のプログラムはかなり最小限で、特にOOPishではありませんが、Cの非実体化された関数ではなく、クラスと名前空間を使用してカプセル化するのが好きです。
pthreads - pthread 条件変数
タスクのキューを持つスレッドを実装しています。最初のタスクがキューに追加されるとすぐに、スレッドが実行を開始します。
スレッドをウェイクアップするために pthread 条件変数を使用する必要がありますか、それともより適切なメカニズムがありますか?
pthread_cond_signal()
他のスレッドがブロックされているのpthread_cond_wait()
ではなく、何かを実行しているときに呼び出すと、どうなりますか? 信号が失われますか?
c - このデッドロックはどこに隠れているのでしょうか?
私は実際にMPIプログラムを書いています。これは基本的なクライアント/サーバー パターンです。サーバーには、計算する一連の作業があります。クライアントは、この大きなセットのサブセットを取得します。各クライアントは、いくつかのスレッドを使用してサブセットを計算します。サーバーに別のサブセットを要求する前に、すべてのスレッドが終了していることを確認する必要があります。
クライアントは、マスター (通信用) と複数のワーカーの複数のスレッドに分割されます。
ここで、デッドロックが発生するはずの実際のコードを示します。読みやすくするために、MPI 呼び出しを削除しました。ここで何が間違っているのか本当にわかりません。
c++ - スレッドセーフキューに問題がありますか?
C++でpthreadを使用してスレッドセーフなキューを作成しようとしています。私のプログラムは93%の時間で動作します。他の7%の時間は、他の人がゴミを吐き出している、または眠りに落ちているようです。コンテキストスイッチがそれを壊すであろう私のキューにいくつかの欠陥があるかどうか疑問に思っていますか?
これは次のように使用できます。
誰かがこれに問題を見つけたら、そう言ってください:)
c - C : pthread データ固有の仕組みは?
pthread dataspecific がどのように機能するかはわかりません。次のコード (Web で見つかります) を考慮すると、これは、たとえばメインで 5 つのスレッドを作成し、それらの一部だけで func を呼び出すことができることを意味します (2 としましょう) ) これらのスレッドは、データの「キー」を何かに設定し (ptr = malloc(OBJECT_SIZE) )、他のスレッドには同じキーが存在しますが、NULL 値がありますか?
dataspecific がどのように機能するか、および pthread でどのように実装されているか (簡単な方法) についての説明をいただければ幸いです。
c - 任意のpthread_tからスレッドIDを取得するにはどうすればよいですか?
pthread_tがあり、CPUアフィニティを変更したいと思います。問題は、 pthread_setaffinity_np()がないglibc2.3.2を使用していることです。ただし、pthread_setaffinity_np()自体がsched_setaffinity()のラッパーであるため、これは問題ありません。これは、プロセスIDの代わりにスレッドIDを渡して、任意のスレッドのアフィニティを設定することで呼び出すことができます。
しかし... sched_setaffinityが使用できるスレッドIDはOSスレッドIDであり、 gettid()システムコールから取得できる種類です。これは不透明(OPAQUE)型のpthread_tとは異なり、gettid()は現在のスレッドのthread-idのみを返します。任意のスレッドのCPUアフィニティを設定できる必要があります。
残念ながら、pthreadのプライベート部分にアクセスできません。そのため、pthread_tをにキャストしてスレッドIDを盗むことができますstruct pthread *
。プライベートな実装に依存することはさらに多くの問題を求めているので、さらに良いと思います。
私もpthread_getunique_np関数を読んでいますが、これは「一意の整数識別子」を返します。これは、OSスレッドIDと同等の形や形式ではないと思います。
したがって、質問:任意のpthread_tからスレッドIDを取得するにはどうすればよいですか?
multithreading - pthreads - ジョブを並列化する方法
n プロセッサ システムで使用するために、単純なパスワード クラッカーを並列化する必要があります。私の考えは、n個のスレッドを作成し、それらが終了するにつれて、それらにますます多くの仕事を与えることです。
スレッドがいつ終了したかを知る最良の方法は何ですか? ミューテックス?他のスレッドが実行されている間、このミューテックスを常にチェックするのは高価ではありませんか?
windows - pthreadとCreateThreadによるデッドロック
Windowsアプリケーションでpthreadを使用しています。プログラムがデッドロックしていることに気づきました。簡単に調べたところ、次のことが発生したことがわかりました。
スレッド1がスレッド2を生成しました。スレッド2がスレッド3を生成しました。スレッド2は、ロック解除されていないスレッド3からのミューテックスを待機していました。
そこで、gdbでデバッグし、3番目のスレッドをバックトレースすると次のようになりました。
どういうわけか、WindowsのCreateThread関数でスタック、デッドロックしました!明らかに、コードの実行を開始することさえできなかったとき、ミューテックスのロックを解除することはできませんでした。それでも、明らかにここでスタックしているという事実にもかかわらず、pthread_createはゼロ(成功)を返しました。
これを特に奇妙なものにしているのは、Linux上の同じアプリケーションにそのような問題がないことです。作成プロセス中にスレッドがハングする(!?)が、正しく作成されたかのように正常に戻る原因は、いったい何でしょうか。
編集:コードのリクエストに応じて、ここにいくつかのコードがあります(簡略化されています):
スレッドの作成:
b_thread_activeが設定されるまで待機することに注意してください。したがって、何らかの形でb_thread_activeが設定されているため、呼び出されるスレッドは何かを実行する必要があります...
...これがlookahead_thread関数です:
lookahead_slicetype_decide(h); スレッドが行うことです。
ミューテックス、synch_frame_list_get_size:
スレッド2のバックトレース:
c - C : 一度だけ呼び出される pthread データ固有のデストラクタ
マンページからpthread_key_create
:
オプションのデストラクタ関数を各キー値に関連付けることができます。スレッドの終了時に、キー値に NULL 以外のデストラクタ ポインタがあり、スレッドにキーに関連付けられた NULL 以外の値がある場合、ポイントされている関数は、現在関連付けられている値を唯一の引数として呼び出されます。スレッドの終了時に複数のデストラクタが存在する場合、デストラクタ呼び出しの順序は指定されていません。
関連するデストラクタを持つすべての非 NULL 値に対してすべてのデストラクタが呼び出された後、関連するデストラクタを持つ非 NULL 値がまだある場合は、プロセスが繰り返されます。未解決の非 NULL 値に対するデストラクタ呼び出しの少なくとも [PTHREAD_DESTRUCTOR_ITERATIONS] 回の反復の後、関連付けられたデストラクタにまだいくつかの非 NULL 値がある場合、実装はデストラクタの呼び出しを停止します。
NULL 以外のスレッド固有の値に対して "Hello World" を出力する単純なデストラクタを使用した小さな例を書きました。私が見る限り、このデストラクタは、デストラクタへの最初の呼び出しの後、スレッド固有の値がまだ NULL ではない場合でも、(少なくとも Linux の fedora と mac os x では) 1 回だけ呼び出されます。
私は何かを逃しましたか?(glibc では PTHREAD_DESTRUCTOR_ITERATIONS = 4)。
ここに私の小さな例があります: