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

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

8
「同時」実行と「並列」実行の違いは?
同時実行と並列実行という用語の違いは何ですか?私はその違いを理解することができませんでした。 このタグは、2つのプロセスを同時に実行する方法として同時実行性を定義しますが、並列処理はまったく同じもの、つまり、別々のプロセッサで実行される可能性のある別々のスレッドまたはプロセスであると考えました。 また、非同期I / Oのようなものを検討する場合、並行性と並列性のどちらを扱いますか?

10
マルチスレッドが難しい理由を説明する方法
私はかなり良いプログラマーであり、上司もかなり良いプログラマーです。彼はマルチスレッドなどのいくつかのタスクを過小評価しているように見えますが、それがどれほど難しいかはわかりません(いくつかのスレッドを実行し、すべてが完了するのを待ってから結果を返す以上のことは非常に難しいと思います)。 デッドロックや競合状態を心配し始めた瞬間、私はそれを非常に難しいと感じますが、上司はこれを感謝していないようです-私は彼がこれに遭遇したことはないと思います。ロックをたたくだけで、態度はほぼ変わりません。 それでは、どうやって彼を紹介したり、なぜ彼が並行性、並列処理、マルチスレッドの複雑さを過小評価しているのかを説明できますか?または多分私は間違っていますか? 編集:彼がやったことのほんの少し-リストをループし、そのリストの各アイテムに対して、そのアイテムの情報に基づいてデータベース更新コマンドを実行するスレッドを作成します。一度に実行されるスレッドの数を彼がどのように制御したかはわかりません。実行中のスレッドが多すぎる場合(キューはセマフォを使用しなかった場合)、キューに追加する必要があります。

2
SQLiteデータベースで同時書き込みが許可されないのはなぜですか?
SQLiteでJavaを使用してデータベースプログラミングを行っています。 データベースへの一度に1つの接続のみが書き込み機能を持ち、多くの接続が一度に読み取り機能を持つことがわかりました。 SQLiteのアーキテクチャがなぜこのように設計されたのですか?書き込まれている2つのものがデータベース内の同じ場所に書き込まれていない限り、なぜ2つの書き込みが一度にできないのですか?

6
オブジェクトプーリングは非推奨のテクニックですか?
私はオブジェクトプーリングの概念に非常に精通しており、常に可能な限りそれを使用しようとしています。 さらに、Java自体と他のフレームワークが可能な限りプーリングを使用することを確認したため、オブジェクトプーリングは標準的な標準であると常に考えていました。 最近、私にとってはまったく新しい(そして直感に反する?)ものを読みました。 このプーリングにより、特に同時実行アプリケーションでは特にプログラムのパフォーマンスが低下します。new新しいJVMではオブジェクトのインスタンス化が非常に高速であるため、代わりにオブジェクトをインスタンス化することをお勧めします。 私は本でこれを読みました: Java Concurrency in Practice 本の最初の部分では、新しいインスタンスを作成する代わりにExecutorsその再利用を使用するようにアドバイスされているので、ここで何かを誤解しているのではないかと考え始めていThreadます。 それでは、オブジェクトプーリングは非推奨になりましたか?

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

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

16
直感的な同時プログラミング抽象化を備えた最新のプログラミング言語[非公開]
私は、システムプログラミングではなく、アプリケーション/ユーザーレベルに重点を置いて、並行プログラミングを学ぶことに興味があります。並行アプリケーションを記述するための直感的な抽象化を提供する最新の高レベルプログラミング言語を探しています。生産性を高め、並行プログラミングの複雑さを隠す言語に焦点を当てたいと思います。 私の生産性が低下し、プログラミングモデルが直感的ではないため、いくつかの例を挙げると、C、C ++、またはJavaでマルチスレッドコードを記述する良いオプションは考えられません。一方、生産性を高め、Pythonやマルチプロセッシングモジュール、Erlang、Clojure、Scalaなどのより直感的な抽象化を提供する言語は、適切なオプションです。 あなたの経験とその理由に基づいて何をお勧めしますか? 編集:あなたの興味深い答えをみんなに感謝します。Erlang、Clojure、Scala、Groovy、そしておそらくHaskellなど、多くの優れた候補者がいるため、実際に試さずに結論を出すことは困難です。私は最も説得力のある議論で答えを投票しましたが、どれを選ぶか決める前にすべての良い候補者を試します:)

11
並行性:設計にどのようにアプローチし、実装をデバッグしますか?
私は数年前から並行システムを開発してきましたが、正式なトレーニングが不足している(つまり学位はない)にもかかわらず、このテーマをかなりよく理解しています。少なくとも最近話題になっているいくつかの新しい言語があります。これらは、ErlangやGoなど、並行処理を容易にするように設計されています。並行性に対する彼らのアプローチは、システムをスケーラブルにし、複数のコア/プロセッサ/マシンを活用する方法に関する私自身の経験を反映しているようです。 しかし、あなたが何をしようとしているのかを視覚化し、少なくとも元のビジョンに近いことを確認するのに役立つツールはほとんどないことがわかります。並行コードのデバッグは、並行処理用に設計されていない言語(C / C ++、C#、Javaなど)では悪夢のようです。特に、開発環境の1つのシステムで簡単に発生する状態を再現することはほとんど不可能です。 それでは、並行性と並列処理に対処するシステムを設計するためのアプローチは何ですか?例: 並行処理できるものとシーケンシャルにする必要があるものをどのように把握しますか? エラー状態を再現し、アプリケーションの実行中に何が起こっているかを表示するにはどうすればよいですか? アプリケーションの異なる並行部分間の相互作用をどのように視覚化しますか? これらのいくつかについては私自身の回答がありますが、もう少し学びたいと思います。 編集 これまでのところ、多くの良い入力があります。リンクされている記事の多くは非常に優れており、私はすでにそれらのいくつかを読みました。 並行プログラミングでの私の個人的な経験から、シーケンシャルプログラミングとは異なる考え方が必要だと思います。精神的な格差は、おそらくオブジェクト指向プログラミングと手続き型プログラミングの違いと同じくらい広いでしょう。この一連の質問では、回答に体系的にアプローチするために必要な思考プロセス(理論)にもっと焦点を当ててほしい。より具体的な回答を提供する場合、例を提供するのに役立ちます-あなたが個人的に経験したこと。 バウンティの目標 何をすべきか教えてはいけません。私はすでにそれをコントロールしています。あなたが何をするか教えてください。これらの問題の解決方法を教えてください。

7
マルチスレッドおよびマルチプロセッサプログラミングの非推奨のプラクティスはありますか?
FORTRANとBASICの初期には、本質的にすべてのプログラムはGOTOステートメントで記述されていました。結果はスパゲッティコードであり、ソリューションは構造化プログラミングでした。 同様に、ポインターはプログラムの特性を制御するのが難しい場合があります。C ++は多くのポインターで開始しましたが、参照の使用をお勧めします。STLのようなライブラリは、依存関係の一部を軽減できます。より優れた特性を持つスマートポインターを作成するイディオムもあり、C ++の一部のバージョンでは参照とマネージコードを許可しています。 継承やポリモーフィズムなどのプログラミング手法では、舞台裏で多くのポインターを使用します(ただし、構造化プログラミングでは分岐命令で満たされたコードを生成します)。Javaのような言語は、プログラマーに依存せずにポインターを削除し、ガベージコレクションを使用して動的に割り当てられたデータを管理します。 私の読書では、セマフォを使用していないように見えるマルチプロセスおよびマルチスレッドのプログラミングの例を見てきました。異なる名前で同じものを使用していますか、それとも同時使用からリソースの保護を構築する新しい方法がありますか? たとえば、マルチコアプロセッサを使用したマルチスレッドプログラミングシステムの具体例は、OpenMPです。環境に含まれていないように見えるセマフォを使用せずに、次のように重要な領域を表します。 th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; } この例は、http://en.wikipedia.org/wiki/OpenMPからの抜粋です。 あるいは、関数wait()およびsignal()を使用したセマフォを使用したスレッドの相互の保護は、次のようになります。 wait(sem); th_id = get_thread_num(); cout << "Hello World from thread " << th_id << '\n'; signal(sem); この例では、物事は非常に単純であり、wait()およびsignal()呼び出しが一致していることを示すには簡単なレビューで十分であり、多くの並行性がある場合でもスレッドセーフが提供されます。しかし、他のアルゴリズムはより複雑で、複数のセマフォ(バイナリとカウントの両方)を使用し、多くのスレッドが呼び出すことができる複雑な条件を持つ複数の関数に分散しています。デッドロックを作成したり、物事をスレッドセーフにできなかったりすることの結果は、管理が難しい場合があります。 OpenMPのようなこれらのシステムはセマフォの問題を排除しますか? 彼らは問題を他のどこかに移動させますか? セマフォを使用しないようにアルゴリズムを使用してお気に入りのセマフォを変換するにはどうすればよいですか?

2
RustはC ++の同時実行機能からどのように分岐しますか?
ご質問 Rustを学ぶために時間を費やすべきかどうかを判断するために、RustがC ++の同時実行機能を根本的かつ十分に改善するかどうかを理解しようとしています。 具体的には、慣用的なRustは、慣用的なC ++の同時実行機能をどのように改善しますか、それとも何らかの相違がありますか? 改善(または相違)はほとんど構文上のものですか、それとも実質的にパラダイムの改善(相違)ですか?それとも別のものですか?それとも、まったく改善(分岐)ではありませんか? 根拠 私は最近、C ++ 14の並行性機能を自分で習おうとしていますが、何かが正しくないと感じています。何か気分が悪い。何が気持ち悪い?言いにくい。 並行処理に関しては、コンパイラが正しいプログラムの作成を実際に支援しようとしていないように感じます。コンパイラではなくアセンブラを使用しているように感じます。 確かに、並行性に関しては、微妙で誤った概念にまだ悩まされている可能性があります。たぶん、私はまだ、ステートフルプログラミングとデータレースの間のBartosz Milewskiの緊張感を理解していません。たぶん、コンパイラーにどれだけの健全な並行方法論があり、OSにどれくらいあるのか、私にはよくわかりません。
35 c++  concurrency  rust  c++14 

5
映画館の座席予約システムは、複数のユーザーが同じ座席を予約することをどのように防止しますか?
映画館には、チケットキオスクがあります。チケットキオスクを使用すると、必要な座席を選択できます。また、同じことを行うWebサイトもあります(Webサイトには、30秒程度のカウントダウンタイマーがあり、座席を選択する必要があります)。 データベーストランザクションや、複数の同時ユーザーを処理するためのその他のテクニックなどは理解していますが、複数の人が同時に座席を選択できる方法について頭を悩ますことはできません。BUYを押した最初の人が席を獲得し、他の人がエラーメッセージを受け取るのと同じくらい簡単ですか、それとも何かが足りませんか?

3
なぜグリーンスレッドではないのですか?
私はこれに関する質問がすでにカバーされていることを知っていますが(例えばhttps://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads)、満足のいく答えが得られたとは感じません。 問題は、なぜJVMがグリーンスレッドをサポートしないのかということです。 コードスタイルのJava FAQでこれを言っています: 緑のスレッドは、すべてのコードが単一のオペレーティングシステムスレッドで実行されるJava仮想マシン(JVM)の動作モードを指します。 そして、これはjava.sun.com上で: 欠点は、グリーンスレッドを使用すると、Linuxのシステムスレッドが利用されないため、CPUを追加してもJava仮想マシンがスケーラブルではないことです。 JVMには、コアの数に等しいシステムプロセスのプールがあり、その上でグリーンスレッドを実行できるように思えます。頻繁にブロックする非常に多くのスレッドがある場合、これはいくつかの大きな利点を提供します(主に現在のJVMがスレッド数を制限するため)。 考え?

4
並行性に対処するためにPythonに固執するか、放棄する必要がありますか?
私はDjangoで書かれた10K LOCプロジェクトを持っています。非同期性と必要なバックグラウンドジョブのためにかなりのセロリ(RabbitMQ)があり、並行性を高めるためにシステムの一部がDjango以外で書き直されることで恩恵を受けるという結論に達しました。理由は次のとおりです。 シグナル処理および可変オブジェクト。特に、あるシグナルが別のシグナルをトリガーする場合、ORMを使用してDjangoでそれらを処理すると、インスタンスが変更または消滅したときに驚く可能性があります。渡されたデータがハンドラー内で変化しないメッセージングアプローチを使用したいと思います(Clojureのコピーオンライトアプローチは、それが正しければ素晴らしいと思われます)。 システムの一部はWebベースではないため、タスクを同時に実行するためのより良いサポートが必要です。たとえば、システムはNFCタグを読み取り、読み取りが行われるとLEDが数秒間点灯し(Celeryタスク)、サウンドが再生され(他のCeleryタスク)、データベースが照会されます(他のタスク)。これはDjango管理コマンドとして実装されますが、DjangoとそのORMは本質的に同期しており、メモリを共有するのは制限されています(NFCリーダーを追加することを考えています。より優れたメッセージパッシング機能を確認したい)。 ErlangやClojureなどの言語を使用する場合と比較して、TwistedやTornadoなどを使用する場合の長所と短所は何ですか?私は実用的な利益と不利益に興味があります。 システムの一部が別の言語でより良くなるという結論にどのように到達しましたか?パフォーマンスに問題がありますか?これらの問題はどの程度深刻ですか?より高速にできる場合、高速であることが重要ですか? 例1: HTTPリクエストの外部で動作するDjango: NFCタグが読み取られます。 データベース(および場合によってはLDAP)がクエリされ、データが利用可能になったときに何かを実行したい(赤または緑のライト、サウンドを再生する)。これはDjango ORMの使用をブロックしますが、利用可能なCeleryワーカーが存在する限り問題ではありません。より多くのステーションで問題になる場合があります。 例2: Djangoシグナルを使用した「メッセージの受け渡し」: post_deleteイベントが処理され、他の目的は、このために変更または削除することができます。 最後に、通知をユーザーに送信する必要があります。ここで、通知ハンドラーに渡される引数が削除済みまたは削除予定のオブジェクトのコピーであり、ハンドラーで変更されないことが保証されていると便利です。(もちろん、ORMが管理するオブジェクトをハンドラーに渡さないことで、手動で行うことができます。)

3
ロック文の中にどれくらいの作業を配置する必要がありますか?
私は、サードパーティソリューションからデータを受信し、データベースに保存し、別のサードパーティソリューションで使用するためにデータを調整するソフトウェアの更新プログラムの作成に取り組んでいるジュニア開発者です。当社のソフトウェアはWindowsサービスとして実行されます。 以前のバージョンのコードを見ると、次のように表示されます。 static Object _workerLocker = new object(); static int _runningWorkers = 0; int MaxSimultaneousThreads = 5; foreach(int SomeObject in ListOfObjects) { lock (_workerLocker) { while (_runningWorkers >= MaxSimultaneousThreads) { Monitor.Wait(_workerLocker); } } // check to see if the service has been stopped. If yes, then exit if (this.IsRunning() == …
27 c#  .net  concurrency  locks 

3
マルチスレッドアプリケーションのUML図
シングルスレッドアプリケーションの場合、クラス図を使用して、そのアプリケーションのアーキテクチャの概要を取得します。ただし、このタイプのダイアグラムは、たとえば、異なるスレッドでクラスの異なるインスタンスが「ライブ」であるため、重いマルチスレッド/同時実行アプリケーションを理解しようとするときにはあまり役に立ちません(つまり、インスタンスへのアクセスは、それが住んでいるスレッド)。したがって、クラス間の関連付けは、必ずしもそれらのオブジェクトのメソッドを呼び出すことができるという意味ではありませんが、代わりにターゲットオブジェクトのスレッドで呼び出しを行う必要があります。 Hassan GomaaによるUMLを使用した並行、分散、およびリアルタイムアプリケーションの設計などのトピックについて掘り下げたほとんどの文献には 、スレッド境界をオブジェクト図に描画するなどの素晴らしいアイデアがありましたが、本当に便利です。 これらの図を問題ドメインの高レベルのビューとして使用するのではなく、クラス/オブジェクト、それらの相互作用、および前述のスレッド境界による制限の詳細な説明として使用します。 したがって、私は知りたい: マルチスレッドアプリケーションの理解に最も役立つとわかったのは、どのような種類の図ですか? マルチスレッドアプリケーションの特性を考慮したクラシックUMLの拡張機能はありますか。たとえば、 一部のオブジェクトは特定のスレッドに存在し、他のオブジェクトはスレッドアフィニティを持たない場合があります。 オブジェクトの一部のフィールドは、任意のスレッドから読み取ることができますが、1つのスレッドからのみ書き込むことができます。 いくつかのメソッドは同期して結果を返しますが、他のメソッドはリクエストをキューに入れて、たとえば異なるスレッドのコールバックを介して結果を返す非同期です。

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