タグ付けされた質問 「multithreading」

テクニック、構造、および安全性の問題を含むマルチスレッド関連の質問。

1
描画スレッドの相互作用
UML(-like)表記でスレッドの相互作用(ペンと鉛筆)を描きたいです。私はUMLを主張しません。読者に明らかなことはすべきです。 私はシーケンス図から始めましたが、これが最善の方法だとは思いません。常に、画面外から来る「アクションイニシエーター」が存在し、SSDのアイデアを壊します。それぞれがステートマシンを所有する9〜10個のスレッドを持つ中規模のコードベースを継承し、その仕組みを理解しようとしています。 スレッドの相互作用を視覚化するにはどうすればよいですか?

8
悪いマルチスレッドのためにほぼ/実際に失敗したプロジェクトからどのような教訓を学びましたか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 悪いマルチスレッドのためにほぼ/実際に失敗したプロジェクトからどのような教訓を学びましたか? フレームワークは、特定のスレッドモデルを課すことがあるため、物事を1桁正しくするのが難しくなります。 私に関しては、最後の障害からまだ回復していないため、そのフレームワークでマルチスレッドに関係することは一切しない方が良いと感じています。 私は、単純な分岐/結合があり、データが一方向にしか移動しない(信号は円形方向に移動できる)マルチスレッドの問題に長けていることがわかりました。 一部の作業は厳密にシリアル化されたスレッド(「メインスレッド」)でのみ実行でき、他の作業はメインスレッド(「ワーカースレッド」)以外のスレッドでのみ実行できるGUIを処理できません。データとメッセージは、N個のコンポーネント間で全方向に移動する必要があります(完全に接続されたグラフ)。 そのプロジェクトを別のプロジェクトに任せたとき、どこにでもデッドロックの問題がありました。2〜3か月後、他の開発者がデッドロックの問題をすべて解決し、顧客に出荷できるようになったと聞きました。不足している知識の一部を見つけることができませんでした。 プロジェクトに関する何か:メッセージID(スレッドに関係なく、別のオブジェクトのメッセージキューに送信できるイベントの意味を表す整数値)の数は数千になります。一意の文字列(ユーザーメッセージ)も約1,000になります。 追加しました (過去または現在のプロジェクトとは無関係に)別のチームから得た最高の例えは、「データベースにデータを置く」ことでした。(「データベース」は集中化とアトミック更新を指します。)すべてが同じ「メインスレッド」で実行され、すべての非GUIヘビーリフティングが個々のワーカースレッドで実行される複数のビューに断片化されるGUIでは、アプリケーションのデータはデータベースのように動作する単一の場所に格納され、「データベース」が重要なデータ依存関係を含むすべての「アトミック更新」を処理できるようにします。GUIの他のすべての部分は、画面の描画のみを処理します。UIパーツはデータをキャッシュする可能性があり、ユーザーが適切に設計されていれば、ほんの数秒で陳腐化していることに気付かないでしょう。この「データベース」は「ドキュメント」とも呼ばれます ドキュメントビューアーキテクチャ。残念ながら、いや、私のアプリは実際にはすべてのデータをビューに保存します。なぜそうだったのか分かりません。 仲間の貢献者: (貢献者は実際の/個人的な例を使用する必要はありません。逸話的な例からの教訓は、自分で信頼できると判断された場合も歓迎します。)

2
使用するmakeスレッドはいくつありますか?
デスクトップ/ラップトップコンピューターで大規模なシステムを(再)ビルドするとき、次のようmakeに、複数のスレッドを使用してコンパイル速度を上げるように指示します。 $ make -j$[ $K * $C ] どこ$Cの数を示すことになっているコアながら、マシンが持っている(私たちは一桁と番号であることを仮定することができ)$K、私は異なるものだ2と4、私の気分に応じました。 したがって、たとえば、make -j124つのコアがある場合、make最大12のスレッドを使用するように指示することができます。 私の理論的根拠は、私が$Cスレッドのみを使用する場合、プロセスがドライブからデータをフェッチするのにビジーである間、コアはアイドルになるということです。しかし、スレッドの数を制限しない場合(つまりmake -j)、コンテキストの切り替えに時間を浪費したり、メモリを使い果たしたり、さらに悪いことにリスクを冒したりします。マシンに$Mギグのメモリがあると仮定しましょう($Mは10のオーダーです)。 したがって、実行するスレッドの最も効率的な数を選択するための確立された戦略があるかどうか疑問に思っていました。

2
JavaおよびC#によってメモリの安全性が提供されるのと同様のプログラミング言語によって、スレッドの安全性をどのように提供できますか?
JavaとC#は、配列の境界とポインターの逆参照をチェックすることにより、メモリの安全性を提供します。 競合状態やデッドロックの可能性を防ぐために、プログラミング言語にどのようなメカニズムを実装できますか?

2
なぜプログラマーは、並列処理のためにC / POSIXを置き換えるプログラミングモデルを定義するのですか?
新しいコンピューターアーキテクチャのプロバイダーは、定期的に新しいプログラミングモデル(最近のGPGPU向けのCUDA / OpenCLなど)の導入を試み、プラットフォームの並列処理の制御インターフェイスとしてC / POSIXを置き換えます。(Poss&Koening、AM3:2015年のメニーコア向けハードウェアUnixアクセラレータに向けて) なぜアーキテクチャ設計者は、並列プログラミングのためにC / POSIXに取って代わるために新しいプログラミングモデルを設計しようとするのですか?C / POSIXはマルチプロセッサにあまり適していませんか、それともC / POSIXの最初の作者はC / POSIX設計時に並列計算を必要としていませんでしたか?それとも、プログラマーがC / POSIXが提供できるよりも多くの機能を必要としているため、CUDA / OpenCLなどの新しい設計に頼っていますか?

1
マイクロコントローラー用RTOSのメッセージキュー
現在、マイクロコントローラー用のRTOSを書いています。全体がC ++ 11で書かれています-誰かが興味を持っていて、リポジトリへのリンクが一番下にある場合。 現在私は、スレッド間(または、割り込みハンドラーとスレッド間、または割り込みハンドラーと他の割り込みハンドラー間)でオブジェクトを受け渡すための単純なデータキューであるクラスを作成しています。通常、私は他のプロジェクトにあるいくつかの共通のAPIを追跡しようとすると、まだ私は持っている同時キューのいずれかの例が見つかりませんでしたemplace()機能とサポートタイムアウトを。 私の一般的な「問題」は、次の2つのインターフェースを決定できないことです。 (std::chrono::duration<Rep, Period>はテンプレートタイプです。わかりやすくするためにテンプレートのボイラープレートは省略しています) 最初のバージョン: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args); int tryPopFor(T&, std::chrono::duration<Rep, Period>); int tryPushFor(const T&, std::chrono::duration<Rep, Period>); int tryPushFor(T&&, std::chrono::duration<Rep, Period>); ... } 2番目のバージョン: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, …


1
概念的には、各スレッドが独自のスタックを取得すると言われているのはどういう意味ですか?
私が読んでてきたブライアン・ゲッツにより、実際にJavaの並行処理を し、セクション内のスタック閉じ込め、各スレッドは独自のスタックを取得し、そのローカル変数は、本質的に実行中のスレッドに限られていることを述べています。これらは実行中のスレッドスタックに存在し、他のスレッドからはアクセスできません。各スレッドが独自の実行スタックを持っているとはどういう意味ですか?

3
分散ロックパターンを探す
C#の分散システム用のカスタム再帰オブジェクトロックメカニズム\パターンを考え出す必要があります。基本的に、私はマルチノードシステムを使用しています。各ノードは、n個の状態に対して排他的な書き込み権限を持っています。同じ状態が、少なくとも1つの他のノードで読み取り専用形式でも利用できます。一部の書き込み/更新はすべてのノードでアトミックである必要がありますが、他の更新はバックグラウンドのレプリケーションプロセスやキューなどを通じて最終的に整合性が取れます... アトミック更新では、オブジェクトを書き込み用にロックされているものとして効率的にマークして、配布、コミット、ロールバックなどを実行できるパターンまたはサンプルを探しています。システムには高レベルの同時実行性があるため、ロックが解除されるとタイムアウトになるか、アンロールされるロックをスタックできるようにする必要があると思います。 トランザクションまたはメッセージングの部分はこの質問の焦点では​​ありませんが、いくつかの追加のコンテキストのためにそれらを提供しました。とはいえ、必要に応じてどのようなメッセージが必要だと思うかを自由に説明してください。 これは、私が想像していたものの漠然としたサンプルですが、まったく新しい製品を実装することを除いて、新しいアイデアを受け入れることができます。 thing.AquireLock(LockLevel.Write); //Do work thing.ReleaseLock(); 次のような拡張メソッドの使用を考えていました public static void AquireLock(this IThing instance, TupleLockLevel lockLevel) { //TODO: Add aquisition wait, retry, recursion count, timeout support, etc... //TODO: Disallow read lock requests if the 'thing' is already write locked //TODO: Throw exception when aquisition fails instance.Lock = lockLevel; } …

6
スレッドは仮想メモリまたは実メモリを使用しますか?
Linuxサーバーを最適化して、プロセスごとに10,000スレッドを処理しようとしていましたが、現在は382スレッドしか処理していません。あたりとして、この記事で、次の式は、可能な全スレッドを調べるために使用されます。 number of threads = total virtual memory / (stack size*1024*1024) つまり、スレッドはすべてのデータを仮想メモリに格納します。そして、私の知る限りでは、仮想メモリは、RAMやキャッシュではなくハードディスクに保存されているLinuxマシンのスワップスペースです。 だから私の質問は、スレッドがデータを処理/格納するために格納するためにハードディスクを使用するかどうかです。 はいの場合、これはパフォーマンスに影響しませんか?それらをRAMまたはキャッシュに置くことでパフォーマンスを向上させることはできますか?どうやって? いいえの場合、スレッドはどのように機能しますか? 更新: 役に立たないの答えによると、仮想メモリは大まかに構成されたシステムです: 物理メモリ(RAM) アタッチしたスワップファイル 仮想アドレスが物理メモリで使用できない場合に仮想アドレスを物理アドレスに変換し、ページフォールトを発行するためのハードウェアサポート (カーネル)ソフトウェアサポート:ハードウェアが使用するルックアップテーブルを管理し、必要に応じてスワップからページをプルすることにより、これらのページフォールトを処理します。 したがって、仮想メモリ上にあるものはすべて、RAM(実メモリ)とハードディスク(スワップファイル)にまとめられます。そしてとしてジェームズ彼の答えの中で説明 HDDは、このようなLRUなどalgorithimsを使用してカーネルによって取られる対ラムの決定。

6
スレッドはなぜスレッドと呼ばれるのですか?
私は、プロセスがリソース所有権と実行可能命令の単位であることを理解しています。スレッドを使用すると、プロセスはリソースを複数の実行と共有できます。また、プロセス全体に関連するすべてのオーバーヘッドにより、OSがスレッドをスケジュールするのが簡単になります。 しかし、なぜ名前のスレッドなのか?文字列または実行のインターリーブへの参照はありますか?それでも、これは私の考えでは直感的な用語ではありません。

1
多くのブロッキングVS単一の非ブロッキングワーカー
接続を受け入れるHTTPサーバーがあり、ヘッダーが完全に送信されるのを何らかの方法で待機していると仮定します。それを実装する最も一般的な方法は何ですか、それ以外の長所と短所は何ですか。私はこれらのことしか考えられません: 多くのブロッキングワーカーは、次の理由で優れています。 それはより敏感です。 新しい接続を導入する方が簡単です(ワーカーが同期リストに追加できるようになるまで外部の人が待つのではなく、自分で接続を取得します)。 CPU使用率は、接続数の増減に応じて自動的に(追加の作業なしで)バランスをとります。 CPU使用量が少ない(ブロックされたスレッドは実行ループから除外され、クライアント間をジャンプするためのロジックは必要ありません)。 単一の非ブロッキングワーカーは、次の理由で優れています。 より少ないメモリを使用します。 レイジークライアント(サーバーへの接続とヘッダーの送信が遅い、またはまったく送信しない)に対する脆弱性が低い。 おそらくお分かりのように、私の意見では、複数のワーカースレッドは全体として少し優れたソリューションのようです。それに関する唯一の問題は、そのようなサーバーを攻撃する方が簡単であることです。 編集(より多くの研究): 私がウェブで見つけたいくつかのリソース(数千のスレッドとブロッキングI / O-Javaサーバーを記述する古い方法は、 Paul Tymaによって再び(そしてより良く)新しくなりました)ブロッキングアプローチは一般により良いが私はまだ偽の接続を処理する方法を本当に知りません。 PSタスクにいくつかのライブラリまたはアプリケーションを使用することをお勧めしません。私は、それが機能するのではなく、実際にどのように機能するか、または機能する可能性があるかを知りたいと思っています。 PSS私はロジックを複数の部分に分割しており、これはHTTPヘッダーの受け入れのみを処理します。それらを処理しません。

3
マルチコアプロセッサ向けのLinuxにおけるロックフリーIPC
マルチコアプロセッサを搭載したCで、Linux上のロックフリーIPCを使用してアプリケーションを作成する方法を見つけようとしています。 FIFOまたは共有メモリに書き込むプロセス1とプロセス2があるとします。次に、プロセス3とプロセス4がその共有メモリまたはFIFOから読み取ります。 これはロックフリーアルゴリズムで可能ですか? ご指導をよろしくお願いいたします。

6
ロックを使用している場合でも、アルゴリズムにロックは不要ですか?
ロックフリーの一般的な定義は、少なくとも1つのプロセスが進行することです。1 キューなどの単純なデータ構造があり、ロックで保護されている場合、1つのプロセスがロックを取得し、必要な処理を実行して解放できるため、1つのプロセスは常に進行できます。 それでは、ロックフリーの定義を満たしていますか? 1たとえば、M。Herlihy、V。Luchangco、M。Moirを参照してください。障害物のない同期:例として両終端キュー。分散コンピューティング、2003年。「一部のスレッドが常に進行することのみを保証する場合、ロックフリーです」。

1
スレッド:カーネルスレッドvsカーネルサポートスレッドvsユーザーレベルスレッド?
これらの違いが何か知っている人はいますか? カーネルスレッドはカーネルを(直感的に)実行するコードに対応しているように見えますが、他の2つについてはわかりません... また、カーネルがすべてのスレッドのスケジューリング/切り替えを実行しているときにライブラリにアクセスしているため、pthread標準はユーザーレベルでカーネルがサポートしていると見なされますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.