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

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

19
7歳の子供にマルチスレッドをどのように説明しますか?
ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 マルチスレッドの概念を7歳の子供に説明する必要がある場合、どうしますか?最近、インタビューでこの質問を受けました。私は仕事(やるべき仕事)と労働者(スレッド)を使ったストーリーを思いつきましたが、それは完全に納得のいくものではありませんでした(子供は若すぎると考えています)。 これについて説明するように頼まれた場合、どうしますか?

4
コルーチンが戻ってきたのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 コルーチンの基礎の大部分は60年代/​​ 70年代に発生し、その後、代替手段(スレッドなど)を支持して停止しました。 Pythonや他の言語で発生しているコルーチンへの新たな関心に対する実質はありますか?

2
共有状態がパフォーマンスを低下させるのはなぜですか?
私は、並行プログラミングの非共有原則の下で働いてきました。基本的に、すべてのワーカースレッドには、同じ状態の不変の読み取り専用コピーがあり、それらは(参照によっても)共有されることはありません。一般的に言えば、これは非常にうまく機能しています。 現在、誰かがすべてのスレッドが同時にアクセスしているロックなしシングルトンキャッシュ(静的辞書など)を導入しています。辞書は起動後に変更されることはないため、ロックはありません。スレッドセーフの問題はありませんでしたが、現在はパフォーマンスが低下しています。 問題は...ロックがないため、このシングルトンの導入がパフォーマンスに影響を与えるのはなぜですか?これを説明できるカバーの下で正確に何が起こっていますか? 確認するために、この新しいシングルトンにアクセスすることが唯一の変更であり、キャッシュへの呼び出しをコメントアウトするだけで確実に再作成できます。


4
「マルチコア」フレンドリーではないと主張するプログラム
このフレーズまたは類似のフレーズは、時々発生します。一般的に、マルチコアプロセッサを最大限に活用するように設計されていないと主張するプログラムを指します。これは、特にビデオゲームプログラミングで一般的です。(もちろん、基本的なスクリプトなど、多くのプログラムには並行性がなく、それを必要としません)。 どうすればいいの?多くのプログラム(特にゲーム)は本質的に同時実行を使用し、OSはCPUのタスクスケジューリングを担当しているため、これらのプログラムは本質的に利用可能な複数のコアを利用していませんか?この文脈で「複数のコアを活用する」とはどういう意味ですか?これらの開発者は、実際にOSタスクのスケジューリングを禁止し、アフィニティまたは独自のスケジューリングを強制していますか?(大きな安定性の問題のように聞こえます)。 私はJavaプログラマーなので、抽象化やその他の理由でこれに対処する必要はなかったかもしれません。

4
非機能言語での永続データ構造の使用
純粋に関数型またはほぼ純粋に関数型の言語は、不変であり、関数型プログラミングのステートレススタイルによく適合するため、永続的なデータ構造の恩恵を受けます。 ただし、Javaのような(状態ベース、OOP)言語の永続データ構造のライブラリが時々見られます。永続的なデータ構造を支持してよく聞かれる主張は、不変であるためスレッドセーフであるということです。 ただし、永続データ構造がスレッドセーフである理由は、1つのスレッドが永続コレクションに要素を「追加」すると、操作は元の要素に要素が追加された新しいコレクションを返すためです。したがって、他のスレッドは元のコレクションを参照します。もちろん、2つのコレクションは多くの内部状態を共有しています。そのため、これらの永続的な構造は効率的です。 しかし、スレッドごとにデータの状態が異なるため、永続データ構造だけでは、あるスレッドが他のスレッドに見える変更を行うシナリオを処理するのに十分ではないように思われます。このためには、アトム、リファレンス、ソフトウェアトランザクションメモリ、またはクラシックロックや同期メカニズムなどのデバイスを使用する必要があるようです。 それでは、なぜPDSの不変性が「スレッドセーフ」にとって有益であると宣伝されているのでしょうか。PDSが同期、または並行性の問題の解決に役立つ実際の例はありますか?または、PDSは、関数型プログラミングスタイルをサポートするオブジェクトへのステートレスインターフェイスを提供する単なる方法ですか?

2
ユニバーサル構造をより効率的にするにはどうすればよいですか?
「ユニバーサルコンストラクション」は、シーケンシャルオブジェクトの線形化を可能にするラッパークラスです(同時オブジェクトの強力な整合性条件)。たとえば、Javaでの[1]からの適応された待機なしの構築は次のとおりです。WFQこれは、インターフェイスを満たす(スレッド間の1回限りのコンセンサスを必要とする)待機なしキューの存在を前提とし、Sequentialインターフェイスを想定しています: public interface WFQ<T> // "FIFO" iteration { int enqueue(T t); // returns the sequence number of t Iterable<T> iterateUntil(int max); // iterates until sequence max } public interface Sequential { // Apply an invocation (method + arguments) // and get a response (return value + state) Response apply(Invocation i); …

3
BackgroundWorkerとAsync / Await
私はC#開発の初心者であり、より応答性の高いUIを作成したいと考えています。私の予備調査では、これを達成するための2つの方法を見てきました。 BackgroundWorkerクラスと組み合わせたマルチスレッド。 新しいAsync / Await修飾子。 新しい方が良いという意味ですか?2つの方法の違いは何ですか?新しいプロジェクトを作成したい場合、どの方法を選択するのですか? 編集:たぶん指定する必要があります。Windows Formsアプリケーションを作成しています。ここでは、必要なすべてのデータがローカルディスクに保存/ロードされます。また、いくつかのUSBデバイスと通信します。

3
専用スレッドロックオブジェクトの命名規則[非公開]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 比較的マイナーな質問ですが、公式のドキュメントやブログに関する意見/議論すら見つけることができませんでした。 簡単に言えば、私が唯一の目的をprivateに提供することを目的とするprivateオブジェクトがある場合、そのオブジェクトlockに何と名前を付けますか? class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } LockingObjectここで何と名付けるべきですか?また、変数の名前だけでなく、ロック時にコード内でどのように見えるかを考慮してください。 さまざまな例を見てきましたが、しっかりしたアドバイスはないようです。 の多数の使用法SyncRoot(およびなどのバリエーション_syncRoot)。 コードサンプル: lock(SyncRoot)、lock(_syncRoot) これは、VBの同等のSyncLockステートメント、SyncRootICollectionクラスのいくつかに存在するプロパティ、およびある種のSyncRootデザインパターンの一部に影響を受けているようです(おそらく悪い考えです) C#コンテキストにいるので、VBishの名前を付けたいかどうかはわかりません。さらに悪いことに、VBでは、変数にキーワードと同じ名前を付けます。これが混乱の原因になるかどうかはわかりません。 thisLockおよびlockThisMSDNの記事から:C#lockステートメント、VB SyncLockステートメント コードサンプル: lock(thisLock)、lock(lockThis) これらが例のために最低限純粋に命名されたかどうかはわかりません staticクラス/メソッド内でこれを使用している場合、ちょっと変です。 編集:ロックに関するウィキペディアの記事も、この命名を例に使用しています PadLock(さまざまなケーシングの)のいくつかの使用法 コードサンプル: lock(PadLock)、lock(padlock) 悪くないが、私の唯一の牛肉は、それは当然の画像呼び出した物理私は関連付けるていない傾向があり、「南京錠」抽象スレッドのコンセプトを。 ロックするものに基づいてロックに名前を付ける コードサンプル: lock(messagesLock)、lock(DictionaryLock)、lock(commandQueueLock) VB SyncRoot MSDNページの例にはsimpleMessageList、プライベートmessagesLockオブジェクトの例があります 実装の詳細は変更される可能性があるため、ロックしている型(「DictionaryLock」)に対してロックに名前を付けることは良い考えではないと思います。ロックしているコンセプト/オブジェクト( "messagesLock"または …

5
並行性とマルチスレッドアプリケーションについて学ぶための最良のリソースは何ですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 4年前に閉鎖されました。 ロックされています。この質問は現在、新しい回答やインタラクションを受け入れていません。詳細をご覧ください。 マルチスレッドアプリケーションと同時プログラミングに関しては、知識のギャップが大きいことに気付きました。私は過去にいくつかの基本をカバーしましたが、そのほとんどは私の心から消えてしまったようです。そして、それは間違いなく私がもっと知りたいと思っている分野です。 並行アプリケーションの構築について学ぶための最良のリソースは何ですか?私は非常に実用的な志向の人間なので、もし本に具体的な例が含まれている方が良いのですが、私は提案を受け入れます。私は個人的には擬似コードまたはC ++で作業することを好み、ゲーム開発への傾斜が最適ですが、必須ではありません。

6
C#5非同期再入可能性のソリューション
そのため、C#5の新しい非同期サポートについて何かが私を悩ませています。 ユーザーは、非同期操作を開始するボタンを押します。呼び出しはすぐに戻り、メッセージポンプが再び実行を開始します-それがポイントです。 そのため、ユーザーはボタンを再度押すことができます-再入を引き起こします。これが問題になったらどうしますか? 私が見たデモでは、await呼び出しの前にボタンを無効にし、その後再び有効にします。これは、実際のアプリでは非常に脆弱なソリューションのように思えます。 特定の実行中の操作に対してどのコントロールを無効にする必要があるかを指定するある種のステートマシンをコーディングする必要がありますか?または、より良い方法がありますか? 操作中はモーダルダイアログを表示したいだけですが、これはまるでハンマーを使用しているように感じます。 誰もが明るいアイデアを持っていますか? 編集: 操作の実行中に使用すべきでないコントロールを無効にすると、多くのコントロールを持つウィンドウがあるとすぐに複雑になると思うので、壊れやすいと思います。最初のコーディングとその後のメンテナンスの両方で、バグの可能性を減らすため、物事をシンプルに保つことが好きです。 特定の操作に対して無効にする必要があるコントロールのコレクションがある場合はどうなりますか?また、複数の操作が同時に実行されている場合はどうなりますか?

3
C#5非同期サポートはUIスレッドの同期の問題をどのように支援しますか?
どこかで、C#5 async-awaitは非常に素晴らしいので、これを行うことを心配する必要はないと聞いた: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here 待機操作のコールバックは、呼び出し元の元のスレッドで発生するようです。Eric LippertとAnders Hejlsbergは、この機能がUI(特にタッチデバイスUI)の応答性を高める必要性に起因すると何度か述べています。 このような機能の一般的な使用法は次のようになると思います。 public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; } } コールバックのみが使用される場合、ラベルテキストを設定すると、UIのスレッドで実行されないため、例外が発生します。 これまでのところ、これが事実であることを確認するリソースが見つかりませんでした。誰もこれについて知っていますか?これがどのように機能するかを技術的に説明するドキュメントはありますか? 「はい」と答えるだけでなく、信頼できるソースからのリンクを提供してください。

2
コンパイラはコンパイル時間を短縮するためにマルチスレッドを利用しますか?
コンパイラのコースを正しく覚えている場合、典型的なコンパイラの概要は次のとおりです。 字句解析プログラムは、ソースコードを文字ごとにスキャンします(またはスキャン関数を呼び出します)。 入力文字列は、妥当性について語彙素の辞書と照合されます 語彙素が有効な場合、対応するトークンとして分類されます パーサーは、トークンの組み合わせの構文を検証します。トークンごとのトークン。 理論的には、ソースコードを4分の1(または任意の分母)に分割し、スキャンおよび解析プロセスをマルチスレッド化することは可能ですか?マルチスレッドを利用するコンパイラは存在しますか?

1
マルチスレッドを使いすぎているかどうかはどうすればわかりますか?
現在、マルチスレッドを使いすぎているように感じます。 A、B、Cの3種類のデータがあります。 それぞれAを複数に変換できB、それぞれBを複数に変換できますC。 私はCsの治療にのみ興味があります。 これは、いくつかの変換関数を使用してかなり簡単に作成できます。しかし、スレッド、3つのキュー(queue_a、queue_bおよびqueue_c)で実装することに気づきました。異なる変換を実行する2つのスレッドと1つのワーカーがあります。 ConverterA読み取りqueue_aおよび書き込みqueue_b ConverterB読み取りqueue_bおよび書き込みqueue_c Worker 各要素を処理します queue_c 変換は平凡であり、このモデルが複雑すぎるかどうかはわかりません。しかし、私には非常に堅牢なようです。各「コンバーター」は、データがキューに到着する前でも動作を開始でき、コード内の任意の時点で新しいAsまたはBsを「送信」するだけで、ワーカーによってジョブをトリガーする変換パイプラインをトリガーします。糸。 結果のコードでさえ、よりシンプルに見えます。しかし、単純なスレッドを悪用しているかどうかはまだわかりません。

5
複数のCPU /コアが同じRAMに同時にアクセスできますか?
これは私が推測するものです: 2つのコアがRAM内の同じアドレスにアクセスしようとした場合、一方が他方にアクセスするのを待つ必要があります。二、彼らはそれぞれアクセスすることができましたように、各コアが同じアドレスにアクセスしようとしている時間は、彼らはまだ、そのRAMがキャッシュされていて、同時にキャッシュを。 2つのコアが同じRAMの異なるアドレスにアクセスしようとすると、一方が他方にアクセスするのを待たなければなりません。 言い換えれば、RAMを集中的に使用するプログラミングタスクでは、コアごとに複数回RAMの同じアドレスから読み取る必要がなければ、マルチプロセッシングはあまり役に立たないと思います。 だから、複数のCPU /コアが同じRAMに同時にアクセスできますか、または私が言っていることは正しいですか?

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