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

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

3
PythonがGILで書かれたのはなぜですか?
グローバルインタープリターロック(GIL)は、スレッド処理などがPythonでややこしい理由の主な理由としてよく引用されているようです。 プログラマーではないので、なぜそうなるのか手がかりがありません-GILを入れる背後にあるロジックは何ですか?


4
スレッドプールとは何ですか?
スレッドプールをどのように実装しますか?私はウィキペディアで「スレッドプール」について読んでいますが、この質問を解決するためにどうすればよいかわかりません(スレッドプールが単純な用語で何であるかよくわからなかったため)。 スレッドプールとは何か、そしてこの質問にどのように答えるのか、誰かが私に簡単な英語で説明できますか?

3
単一のスレッドは複数のコアでどのように実行されますか?
私は、シングルスレッドが複数のコアでどのように実行されるかを高レベルで理解しようとしています。以下は私の理解です。私はそれが正しいとは思わない。 Hyper-threadingの私の読書に基づいて、OSはすべてのスレッドの命令を、それらが互いに待機しないように編成しているようです。次に、CPUのフロントエンドは、各コアに1つのスレッドを配布することにより、これらの命令をさらに整理し、オープンサイクル間で各スレッドから独立した命令を配布します。 そのため、スレッドが1つしかない場合、OSは最適化を行いません。ただし、CPUのフロントエンドは、独立した命令セットを各コアに分配します。 https://stackoverflow.com/a/15936270によると、特定のプログラミング言語が作成するスレッドは多かれ少なかれありますが、それらのスレッドで何をすべきかを判断する際には無関係です。OSとCPUがこれを処理するため、使用されるプログラミング言語に関係なくこれが発生します。 明確にするために、単一のコアで複数のスレッドを実行するのではなく、複数のコアで実行される単一のスレッドについて尋ねています。 要約の何が問題になっていますか?スレッドの命令は複数のコアにどこでどのように分割されますか?プログラミング言語は重要ですか?これは広範なテーマであることを知っています。私はそれについて高レベルの理解を望んでいます。

15
現在のソフトウェア業界でマルチスレッドはどれほど重要ですか?[閉まっている]
MVCフレームワーク(ストラットなど)を使用してJavaでWebアプリケーションを作成した経験が3年近くあります。私は主要な小売チェーン向けのコードを書いていますが、これまでマルチスレッドコードを書いたことはありません。 インタビュー中にマルチスレッドに関するいくつかの質問があり、通常はそれらに回答します(ほとんどが単純な質問です)。これにより、現在の業界シナリオでマルチスレッドがどれほど重要か疑問に思いました。

1
繊維、コルーチン、緑色の糸に違いはありますか?
今日、私は繊維、コルーチン、緑の糸についてインターネットでいくつかの記事を読んでいた。これらの概念は非常に共通しているようだが、特に繊維とコルーチンについて話すときは、わずかな違いがある。 それらが互いに異なる理由の簡潔で正しい要約はありますか? 更新:繊維とコルーチンの区別に特に優れているのは、コルーチンと繊維の識別(N4024 C ++ドラフト)文書です。

12
プログラムが特定の最小数のCPUコアを必要とするのはなぜですか?
N個未満のコアを持つCPUで実行すると正常に動作しないコード(またはコードではなく完全なソフトウェア)を作成することはできますか?明示的にチェックせず、意図的に失敗することなく: IF(noOfCores <4)その後、意図的に適切に実行されない 私はゲームの(Dragon Age:Inquisition)最小システム要件を調べていますが、それは最低4コアCPUを示しています。多くのプレイヤーは、2コアCPU および2つの物理コアと2つの論理コアを備えたIntel Core i3では動作しません。そして、それは計算能力の問題ではありません。 私の理解では、スレッドはOSによってCPUから完全に分離されています。 ただ物事をクリアするために: 私はありません「私はコードからCPUコアの数を調べると、意図的に失敗することはできますか?」尋ねます ...そのようなコードは意図的ではありません(計算能力を必要とせずに、プログラムを実行するためにより高価なCPUを購入せざるを得ません)。たとえば、コードが4つのスレッドを持ち、同じ物理コアで2つのスレッドが実行されると(システム情報を明示的に確認して意図的に失敗することなく)失敗するようにしています。 要するに、複数のコアから来る追加の計算能力を必要とせずに、複数のコアを必要とするソフトウェアが存在できるのでしょうか?N個の個別の物理コアが必要です。

6
マルチスレッドの競合状態のテスト
この回答へのコメントを読む、具体的には: テストを書くことができないからといって、テストが壊れていないわけではありません。通常、期待どおりに動作する未定義の動作(CおよびC ++はそのすべてで満たされています)、競合状態、メモリモデルの弱さによる潜在的な再配列... – CodesInChaos 7時間前 @CodesInChaos再現できない場合、「修正」に書き込まれたコードもテストできません。未テストのコードを公開することは、私の意見では最悪の犯罪です– RhysW 5時間前 ...テストケースの競合状態が原因で、本番環境で非常にまれにしか発生しない問題を一貫して引き起こす良い一般的な方法があるかどうか疑問に思っています。

16
ほぼ確実に発生する可能性のない競合状態を処理する必要がありますか?
メインスレッドがUIをほぼ瞬時に更新し、他のスレッドがネットワーク経由でデータをポーリングしているGUIアプリケーションや、ジョブの完了に5〜10秒かかることが保証されているGUIアプリケーションのようなものを考えてみましょう。 私はこれについて多くの異なる回答を受け取りましたが、統計的不可能の競合状態である場合、それをまったく心配しないと言う人もいますが、10-53%さえあればあなたは数字ではなく、これは私が聞いたものです)競合状態のために起こっているブードゥー教の魔法、常にそれを必要とするスレッドのロックを取得/解放します。 あなたの考えは何ですか?このような統計的に不可能な状況で競合状態を処理するのは、プログラミングの良い習慣ですか?または、読みやすさを妨げるためにコードの行を追加することはまったく不要であるか、逆効果になるでしょうか?

8
マルチスレッドJavaScriptランタイム実装を作成することの欠点は何ですか?[閉まっている]
この1週間、マルチスレッドJavaScriptランタイムの実装に取り​​組んでいます。JavaScriptCoreとboostを使用して、C ++で作成した概念実証があります。 アーキテクチャは単純です。メインスクリプトの評価が完了すると、ランタイムは起動してスレッドプールに参加します。スレッドプールは、共有優先度キューからタスクを選択し始めます。2つのタスクが同時に変数にアクセスしようとすると、アトミックとマークされ、アクセスを争います。 問題は、この設計をJavaScriptプログラマーに見せると、非常に否定的なフィードバックが得られ、その理由がわからないことです。非公開でも、JavaScriptはシングルスレッドである必要があり、既存のライブラリを書き換える必要があり、作業を続けるとグレムリンがすべての生物を生成して食べると言う。 私はもともとネイティブのコルーチン実装(ブーストコンテキストを使用)も配置していましたが、それを捨てなければなりませんでした(JavaScriptCoreはスタックについてはしゃれています)。 どう思いますか?JavaScriptはシングルスレッドを対象としていますが、JavaScriptはそのままにしておくべきですか?誰もが同時JavaScriptランタイムのアイデアに反対しているのはなぜですか? 編集:プロジェクトは現在GitHubにあります。自分で試してみて、あなたの考えを教えてください。 以下は、競合なしですべてのCPUコアで並行して実行されるプロミスの図です。

19
大規模サイトでのバックグラウンドタスクのサービス
StackOverflowの興味深い問題を扱っています。 私たちには、「すぐにやる必要がある」小さなタスクがたくさんあります。例は、「関連する質問」リストの更新です。過去に行ったことは、これらのタスクを一部のユーザーのページロードにピギーバックすることです。 これは決して理想的ではありませんでしたが、それほど目立ちませんでした。SOが1,000,000の疑問符を通過したので、それらの不運なユーザーはそれを感じ始めています。 自然な解決策は、これらのタスクを実際にバックグラウンドにプッシュすることです。私が検討しているこれを行うには2つの広い方法があります。 1. IISでカスタムスレッドプール/ワークキューとして 基本的に、IISに干渉しないようにいくつかのスレッド(非ThreadPool)をスピンアップし、Funcsを入れているコレクションにサービスを提供します。 ここでの大きな利点はシンプルです。マーシャリングについて心配する必要も、外部サービスが起動して応答することを確認する必要もありません。 また、すべての共通コードにアクセスできます。 欠点は、バックグラウンドスレッドを使用しないことです。私が知っている異議はすべて、IISの飢star(ThreadPoolを使用している場合)とスレッドのランダムな消滅(AppPoolのリサイクルのため)に集中しています。 ランダムスレッドデスを非問題にするための既存のインフラストラクチャがあり(基本的にタスクの検出は中止されています)、スレッド数の制限(および非スレッドプールスレッドの使用)も難しくありません。 IISプロセスのスレッドプーリング/ワークキューに他の異議がありませんか? ここでは実際には対処されなかったため、StackOverflowに移動しました。 2.サービスとして サードパーティのソリューション、またはカスタムソリューションのいずれか。 基本的に、プロセスの境界を越えて何らかのサービスにタスクをマーシャリングし、それを忘れます。おそらく、生のSQL +接続文字列の一部のコードをリンクしている、または制限しているのでしょう。 プロは、これを行うための「正しい方法」であるということです。 短所は、できることが非常に制限されているか、このサービスをコードベースと同期させるために何らかのシステムを作成する必要があることです。また、監視とエラーログのすべてをなんらかの方法で接続する必要があります。これは、「IIS内」オプションで無料で取得できます。 サービスアプローチには他の利点や問題がありますか? 簡単に言えば、アプローチ#1を実行不可能にする予測不可能で克服できない問題がありますか。もしそうなら、アプローチ#2を検討する必要がある優れたサードパーティサービスはありますか。

1
go-langs goroutineプールは単なるグリーンスレッドですか?
ここでの解説は、グリーンスレッドの以下の批判を提供しています: 私は当初、コールバック地獄のないイベント駆動型プログラミングの手段としてN:Mモデルで販売されていました。古い手続き型コードのように見えるコードを書くことができますが、その下には、何かがブロックされるたびにユーザースペースのタスク切り替えを使用する魔法があります。いいね。問題は、複雑さをより複雑に解決することになるということです。swapcontext()およびファミリはかなり単純であり、複雑さは他の意図しない場所に由来します。 突然、ユーザー空間のスケジューラーを書くことを余儀なくされ、何年もかけて努力を重ねてきたLinuxのスケジュールよりも良い仕事をするスケジューラーを書くのは本当に難しいと思います。ここで、N個の緑色のスレッドからM個の物理的なスレッドをスケジュールして、同期を心配する必要があります。同期はパフォーマンスの問題を引き起こすため、新しいロックレスウサギの穴を掘って今すぐ始めます。正確で高度な並行スケジューラーを構築するのは簡単なことではありません。 別の批評はここにあります: 複数のスレッドを偽装する単一のプロセスには、多くの問題があります。その1つは、偽のスレッドがすべてページフォールトで停止することです。 私の質問は- されて行く-LANGのゴルーチン(デフォルトプール用)ちょうどグリーンスレッド?もしそうなら-彼らは上記の批判に対処しますか?

10
コードで100%CPUを使用しないのはなぜですか?[閉まっている]
Windows XP以降で実行されるC#.NET 4プログラムについて具体的に説明していますが、一般的な回答も受け入れられます。 すでに最適化された効率的なプログラムを想定します。ここでの問題は、ハードウェアのCPU使用率が高いことの影響と、実装を効率化するかどうかではなく、使用率の高いプログラムを制限して摩耗を減らすかどうかにかかっています。 今日の同僚は、「最新のCPUは安価であり、100%のCPUで急速に劣化する」ため、データロードプロセスで100%のCPU使用率を目指してはならないと提案しました。 これは本当ですか?もしそうなら、なぜですか?以前は、集中的な操作や長時間の操作には100%のCPU使用率が望ましいという印象を受けていましたが、どちらの方法でも対象に関する立派なソースを見つけることができませんでした。
42 c#  multithreading  cpu  usage 

5
不変性は、マルチプロセッサプログラミングでのロックの必要性を完全に排除しますか?
パート1 明らかに不変性は、マルチプロセッサプログラミングでのロックの必要性を最小限に抑えますが、その必要性を排除しますか、または不変性だけでは不十分な場合がありますか?ほとんどのプログラムが実際に何かを行う(データストアを更新する、レポートを作成する、例外をスローするなど)前に処理を延期し、状態をカプセル化できるのは私だけのようです。そのようなアクションは常にロックなしで実行できますか?元のオブジェクトを変更するのではなく、各オブジェクトを破棄して新しいオブジェクトを作成するという単純なアクション(不変性の大まかな見方)は、プロセス間競合からの絶対的な保護を提供しますか、それともロックが必要なコーナーケースがありますか? 私は多くの機能的なプログラマーと数学者が「副作用なし」について話すのを好むことを知っていますが、「現実の世界」では、機械命令を実行する時間であっても、すべてに副作用があります。理論的/学術的答えと実用的/現実世界の答えの両方に興味があります。 特定の境界または仮定が与えられれば、不変性が安全であれば、「安全ゾーン」の境界が正確に何であるかを知りたいです。可能な境界のいくつかの例: I / O 例外/エラー 他の言語で書かれたプログラムとの相互作用 他のマシンとの相互作用(物理、仮想、または理論) この質問を始めたコメントに対して@JimmaHoffaに感謝します! パート2 多くの場合、マルチプロセッサプログラミングは最適化手法として使用され、コードの実行を高速化します。ロックと不変オブジェクトを使用する方が速いのはいつですか? アムダールの法則で定められた制限を考えると、不変オブジェクトと可変オブジェクトのロックで全体的なパフォーマンスを向上させることができます(ガベージコレクターの有無にかかわらず)。 概要 これら2つの質問を1つにまとめて、スレッド化の問題の解決策として不変性の境界ボックスがどこにあるのかを探ろうとしています。

4
GUIプログラミングでスレッドの安全性を確保するのはなぜ呼び出し側の責任ですか?
多くの場所で、UIコンポーネントを更新するときにUIスレッド上にいること(具体的には、Javaスイングでは、イベントディスパッチスレッド上にいることを確認することは呼び出し側の責任であることは、標準的な知恵1です) 。 これはなぜですか?イベントディスパッチスレッドは、MVC / MVP / MVVMのビューの問題です。ビュー以外の場所で処理するには、ビューの実装と、そのビューの実装のスレッドモデルとの間に密結合を作成します。 具体的には、Swingを使用するMVC設計のアプリケーションがあるとします。呼び出し元がイベントディスパッチスレッドのコンポーネントの更新を担当している場合、JavaFX実装のSwing View実装を交換しようとすると、代わりにJavaFXアプリケーションスレッドを使用するようにすべてのプレゼンター/コントローラーコードを変更する必要があります。 だから、私は2つの質問があると思う: UIコンポーネントのスレッドの安全性を確保するのは、呼び出し側の責任なのはなぜですか?上記の推論の欠陥はどこにありますか? これらのスレッド安全性の懸念を疎結合しながら、適切にスレッドセーフであるようにアプリケーションを設計するにはどうすればよいですか? MCVE Javaコードを追加して、「呼び出し側の責任」が意味することを説明します(ここには、私がやっていませんが、できる限り最小限にするために他の良い習慣があります)。 責任者である発信者: public class Presenter { private final View; void updateViewWithNewData(final Data data) { EventQueue.invokeLater(new Runnable() { public void run() { view.setData(data); } }); } } public class View { void setData(Data data) { component.setText(data.getMessage()); } } …

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