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

並行性は、複数のプロセスが同時に実行されているシステムの特性です。

7
なぜ並行プログラミングを知る必要があるのですか?
並行プログラミングは私にとって非常に困難です。基本的なスライドを見るだけでも、私にとっては難しいようです。それはとても抽象的なようです。 コンカレントプログラミングの概念をよく知ることの利点は何ですか?通常のシーケンシャルプログラミングで役立ちますか?私たちのプログラムがどのように機能するかを理解することに満足があることを知っていますが、他に何がありますか?

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); …

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

1
Consumer / ProducerとObserver / Observableの違い
私は、次の3つの部分で構成されるアプリケーションの設計に取り組んでいます。 特定のイベントの発生(ファイルの作成、外部リクエストなど)を監視する単一のスレッド これらのイベントを処理することでこれらのイベントに応答するN個のワーカースレッド(各ワーカーは単一のイベントを処理して消費し、処理に時間がかかる場合があります) これらのスレッドを管理し、エラー処理を行うコントローラー(スレッドの再起動、結果のログ記録) これは非常に基本的で実装するのは難しくありませんが、それを行うための「正しい」方法は何だろうと思っています(この具体的なケースではJavaですが、より高い抽象化の答えもありがたいです)。2つの戦略が思い浮かびます。 Observer / Observable:監視スレッドはコントローラーによって監視されます。イベントが発生した場合、コントローラーに通知され、再利用可能なキャッシュスレッドプールから新しいタスクを空きスレッドに割り当てることができます(または、すべてのスレッドが現在ビジーである場合、FIFOキューでタスクを待機してキャッシュします)。ワーカースレッドはCallableを実装し、結果(またはブール値)で成功を返すか、エラーを返します。その場合、コントローラーは何をすべきかを決定します(発生したエラーの性質に応じて)。 プロデューサー/コンシューマー:監視スレッドはコントローラーとBlockingQueueを共有し(イベントキュー)、コントローラーはすべてのワーカーと2つを共有します(タスクキューと結果キュー)。イベントの場合、監視スレッドはタスクオブジェクトをイベントキューに入れます。コントローラーは、イベントキューから新しいタスクを取得し、それらをレビューして、タスクキューに入れます。各ワーカーは新しいタスクを待機し、タスクキュー(先着順、キュー自体で管理)からそれらを取得/消費し、結果またはエラーを結果キューに戻します。最後に、コントローラーは結果キューから結果を取得し、エラーが発生した場合に対応する手順を実行できます。 両方のアプローチの最終結果は似ていますが、それぞれわずかな違いがあります。 オブザーバーを使用すると、スレッドの制御は直接行われ、各タスクは特定の新しく生成されたワーカーに割り当てられます。スレッド作成のオーバーヘッドは高くなる可能性がありますが、キャッシュされたスレッドプールのおかげではありません。一方、Observerパターンは、複数ではなく単一のObserverに縮小されます。これは、厳密に設計されたものではありません。 キュー戦略は拡張が容易なようです。たとえば、1つではなく複数のプロデューサーを追加するのは簡単で、変更を必要としません。欠点は、作業をまったく行わない場合でも、すべてのスレッドが無期限に実行され、エラー/結果の処理が最初のソリューションほど洗練されていないことです。 この状況で最もふさわしいアプローチは何ですか?その理由は?ほとんどの例は、Observerケースの新しい値で多くのウィンドウを更新したり、複数のコンシューマーとプロデューサーで処理したりするなど、明確なケースのみを扱っているため、この質問に対する答えをオンラインで見つけるのは難しいと感じました。どんな入力でも大歓迎です。

3
並列処理は並行性を意味しますが、その逆ではありませんか?
並列処理と並行処理は異なるものだとよく読みます。非常に多くの場合、回答者/コメント者は、まったく異なる2つのものであると書いているだけです。しかし、私の見解では、それらは関連していますが、その点について明確にしたいと思います。 たとえば、マルチコアCPUを使用していて、計算をx個の小さな計算(たとえば、fork / joinを使用)に分割し、それぞれを独自のスレッドで実行する場合、並列計算を実行するプログラムがあります(なぜならおそらく、任意の時点で複数のスレッドが複数のコア上で実行しようとして)されていると同時右のもの? たとえば、単にJavaを使用して、イベントディスパッチスレッドでUIイベントと再描画を処理し、自分で作成した唯一のスレッドを実行している場合、並行プログラム(EDT + GCスレッド+メインスレッド)がありますなど)が、並列ではありません。 これが正しいかどうか、および並列処理(「単一だがマルチコア」システムで)が常に並行性を意味するかどうかを知りたいのですが。 また、マルチスレッドプログラムはマルチコアCPUで実行されていますが、異なるスレッドがまったく異なる計算を実行している場合、「並列処理」を使用していると見なされますか?

1
汎用C ++ラッパーを使用してRustの所有権モデルを実現できますか?
Rustの並行処理の安全性に関するこの記事をご覧ください。 http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html これらのアイデアのどれだけがC ++ 11(またはそれ以降)で達成できるのかと思っていました。特に、所有権を渡すメソッドに所有権を譲渡する所有者クラスを作成できますか?C ++には変数を渡す方法がたくさんあるので不可能だと思われますが、クラスまたはテンプレートにいくつかの制限を設けて、メソッドのパスごとにテンプレートコードが実行されるようにすることができますか?

2
トランザクションが複数のオブジェクトにまたがらない場合、オブジェクトごとのオプティミスティック同時実行性は直列化可能性を意味しますか?
以下を提供するシステムを考えます: オブジェクトごとのオプティミスティックな同時実行制御/バージョン管理(CAS-Check-and-Setを使用) 単一のオブジェクト以上に及ぶ必要のないトランザクション。 スナップショット分離 このシステムはシリアライズ可能と見なされますか? スナップショット分離から 書き込みスキューの異常では、2つのトランザクション(T1およびT2)が重複するデータセット(値V1およびV2など)を同時に読み取り、互いに素な更新(T1更新V1、T2更新V2など)を同時に行い、最後に同時にコミットします。他方によって実行された更新。システムが直列化可能である場合、T1またはT2のいずれかが「最初に」発生し、もう一方に見える必要があるため、このような異常は不可能です。対照的に、スナップショット分離では、書き込みスキューの異常が許可されます。 具体的な例として、V1とV2が一人のPhilによって保持されている2つの天びんであることを想像してください。銀行は、V1またはV2のいずれかが赤字になることを許可します。ただし、両方の合計がマイナスになることはありません(つまり、V1 + V2≥0)。両方の残高は現在100ドルです。Philは2つのトランザクションを同時に開始します。T1はV1から200ドルを引き出し、T2はV2から200ドルを引き出します。 これに基づいて、書き込みスキューの可能性があることが、スナップショット分離がシリアル化可能でないことを保証するシステムの唯一の理由であると思われます。 ただし、トランザクションが複数のオブジェクトにまたがることを許可しないシステム(上記の例V1およびV2)では、書き込みスキューが発生することは不可能と思われます。 したがって、上記のシステムはシリアライズ可能です。これは正しいです?

2
アクターモデルの説明は正しいですか?
私が理解した場合、アクターモデルはオブジェクトモデルに似ていますが、いくつかの違いがあります。 すべてのオブジェクトはそれ自身の独立したスレッドを生成し、数千のオブジェクトがある場合でも問題はありません。 アクターは、関数を呼び出して戻り値を取得することによって対話するのではなく、メッセージを送受信することによって対話します。 そのモデルに違反しない場合、アプリは競合状態のリスクなしに、最大限の同時実行を使用します。 オブジェクト指向でできることはすべて、アクターを使用して行うことができますが、問題は、ここ数年でコーディングしたすべてがオブジェクト指向に基づいていたということです-しかし、移行は差し迫っています。 したがって、たとえば、3Dベクトルクラス/アクターを定義し、2つのインスタンスを作成し、それらの和演算を呼び出す必要があるとします。 オブジェクト指向: class V3d { constructor V3d(x,y,z) //bla float x,y,z; function sum(V3d b) { return V3d(x+b.x,y+b.y,z+b.z); } } //using: mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly drawPoint(mySum) //uses the result 俳優モデル: actor V3d { constructor V3d(x,y,z) //bla float x,y,z; loop { receive 'sum',b:V3d …

5
暗黙的な並列処理/同時実行性がそれほど普及していないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 暗黙的な並列処理^は、多くのプログラマーから大きな負担を取り除き、コンピューターに置くことができます。だから...なぜそれが現在それほど普及していないのですか? ^暗黙的な並列処理とは、スレッドなどを使用してこの作業を行う必要のあるプログラマーの代わりに、コンピューターが一度に複数のことを行う方法を把握できるようにすることです。

5
計算に使用するコアの数 #coresまたは#cores -1?
私はやるべき大きな計算があります。すべてのコアを使用できますが、1つのコアを使用せずに使用しない理由はありますか?(計算CPUはIOなしのみ)。または、すべてのコアを利用しても、適切なコンテキストスイッチングを処理および実行することを知らないOSを過小評価していますか?

1
並行性について推論するためにどの中間表現を使用できますか?
私は、コンパイラーがプログラマーに代わって並行性に関してインテリジェントな選択を行えるようにするために必要なものをよりよく理解しようとしています。たとえば、この問題には多くの困難な側面があることを理解しています。 競合状態がないことを確認する 同時に実行されるコードに、コードのセマンティックな意味に影響を与える副作用がないことを保証する コードで利用可能な並列度を考慮して、スレッドのスピンアップによるオーバーヘッドが価値があるかどうかを判断する 私の理解では、最新のコンパイラで使用される2つの主要な中間表現は、手続き型言語とオブジェクト指向言語の静的な単一割り当てと、関数型言語のスタイルを渡す継続です。これらの中間形式を使用して、上記の問題のいずれかを推論することは難しいようです。理論的には自動並列化の可能性が最も高い言語(副作用のない保証付きのHaskellのような純粋な関数型言語)でさえ、この分野での進歩は限られています。 私の質問は、この問題に取り組むためにどのような中間表現が実際に使用されているのかということです。学術研究で使用されているが、このタスクに適しているとは知らない他の表現はありますか?この問題は、コンパイルが中間表現に到達する前に抽象構文ツリーを操作することにより、コンパイラーのフロントエンドで根本的に解決する必要があるものですか?

2
無料のランチオーバーですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉まっている 6年前にました。 2005年の有名なThe Free Lunch Is Overの記事で、Herb Sutterは並行プログラミング革命がオブジェクト指向革命と同じくらい大きいと予測しました。この革命は2005年から2013年に本当に起こったのですか? 記事のキーポイント: プロセッサメーカーは、CPUパフォーマンスを向上させるための従来のアプローチのほとんどを使用してスペースを使い果たしました。クロックスピードをこれまで以上に高速化する代わりに、ハイパースレッディングとマルチコアアーキテクチャを採用しています。 CPUスループットの向上を十分に活用したい場合、アプリケーションはますます並行する必要があります。 「ああ、パフォーマンスはそれほど重要ではありません。コンピューターは高速化を続けるだけです」と言うのは間違っているでしょう。 効率性とパフォーマンスの最適化は、重要性がますます大きくなります。すでに高度な最適化に適している言語は、新しい命を見つけるでしょう。そうでない人は、競争する方法を見つけ、より効率的で最適化できるようにする必要があります。パフォーマンス指向の言語とシステムに対する長期的な需要の増加を期待してください。 プログラミング言語とシステムは、ますます並行性に対処することを余儀なくされます。並行性のために、現在の言語よりも高いレベルのプログラミングモデルが必要です。

2
Javaの同時実行性に関するこれらの高度/不公平なインタビューの質問はありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 以下は、Javaの並行性を知っていると言っているインタビュー対象者に最近尋ねた質問です。 「メモリの可視性」の危険性-JVMがモニターによって保護されておらず宣言されていない変数に対する特定の操作を並べ替える方法volatile。1つのスレッドが別のスレッドによる変更を認識できないようにする方法。通常、このハザードが存在する場所にコードNoVisibilityを表示し(例:Goetz et alの「Java Concurrency in Practice」のリスト3.1 の例)、何が問題なのかを尋ねることでこれを要求します。 volatile宣言された実際の変数だけでなく、変数がvolatile変更する前にスレッドによって行われた変数への変更にも影響することを説明しvolatileます。 なぜvolatile代わりに使用するのsynchronizedでしょうか? wait()およびで条件変数を実装しますnotifyAll()。を使用する理由を説明しますnotifyAll()。条件変数をwhileループでテストする必要がある理由を説明します。 私の質問は-これらは適切であるか、Javaの並行性を知っていると言う人に尋ねるには高度すぎるのでしょうか? そして、私たちがそれに取り組んでいる間、Javaの並行性で働いている誰かがJavaガベージコレクションの平均以上の知識を持っていると期待されるべきだと思いますか?

2
いくつかのマイクロサービスが失敗した場合、それらを更新するソフトウェアをどのように設計しますか?
他のサービスが安定している間、ダウンまたはダウンするサービスを支援するために使用できる設計パターンまたはプラクティスはありますか? 3つのマイクロサービスがあり、そのうち2つが正常で、1つがPOSTの途中で停止した場合はどうなりますか?2つはPOSTを受け取り、1つは受け取りません。リクエストをサービスに発送しているため、取引ができないと思います。 そのためにどのように設計しますか?さまざまなデータベースに孤立したデータは必要ありません。

1
Erlangはどのような意味のある方法で並行プログラミングの競合状態を防ぎますか?
Erlangの並行性について読むと、Akka並行性ツールキットを思い出します。どちらも、競合状態を防止または制限するツールを提供します。ただし、Akkaツールキットを使用すると、可変データへのリンクを他のプロセスに送信できますが、これはまだ安全ではありません。Akkaは便利なツールであると考えていますが、競合状態、デッドロック、飢starにつながるオブジェクトやデータへの順不同のアクセスに対する保護は提供しません。JavaまたはC#がC ++で記述できるほとんどの種類のメモリリークの書き込みから保護する方法で、安全でないコードを書くことを妨げません(ガベージコレクターをだましてJavaでメモリリークを作成できますが、割り当てたすべてのバイトを解放することを覚えておく必要があるよりも問題があります)。 Erlangは、並行プログラミングのある程度の正確性、パフォーマンス、および堅牢性を保証しますか?オペレーティングシステムは、システムリソースにアクセスするときに保護を提供すると思います(ドライバーライターが仕事を上手く行ったと仮定)。ACIDデータベースは、読み取りと更新の保護を提供します。これは解決可能な問題のようです。または、一般的な安全なソリューションは、並行性が提供するパフォーマンスの向上を消去しますか?他の言語またはツールキットは、Erlangが提供する(または提供しない)並行安全性を提供しますか? これは、どのプログラミング言語が見つけにくいバグをほとんど生成しないかに対する@ user1249の回答に対する@Malfistのコメントに対する追加の質問ですか?。

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