問題タブ [concurrent-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ブロッキングロックと非ブロッキングロック
私はここで考えています:同期する必要があるFAST操作を実行する2つのスレッドがある場合、非ブロッキングアプローチはブロッキング/コンテキストスイッチアプローチよりも高速/優れていませんか?
非ブロッキングとは、次のような意味です。
while(true){if(checkAndGetTheLock())break; }
私が考えることができる唯一のことは、ロックの周りでループしているスレッドが多すぎる場合の(CPUのバーンアウトによる)飢餓です。
あるアプローチと他のアプローチのバランスをとるにはどうすればよいですか?
c# - アイテムの削除をサポートするスレッドセーフコレクション
特定のアイテムを削除するか、述語を渡してそれに基づいてアイテムを削除できる単純なRemove()関数をサポートする.NETスレッドセーフ/同時収集が見つからないようです。私が試してみました:
この動作をサポートするコレクションを知っている人はいますか、それとも自分で作成する必要がありますか?
スレッドセーフキューから次のアイテムを削除せずに取得できるようにしたいのですが、後で特定の条件が満たされた場合は、削除を続行します。
c++ - 2 つのプロセス間で通信する方法
こんにちは、私は OS の独立性を維持しようとしている C++ プロジェクトに取り組んでおり、通信する必要がある 2 つのプロセスがあります。他の 2 つのプロセスを非同期で調整するために、3 つ目のプロセス (おそらくサービスとして?) をセットアップすることを考えていました。
クライアント 1 は、データの準備ができたときに中間プロセスに通知し、データを送信します。中間プロセスは、クライアント 2 がデータの準備が整ったことを通知するまで、このデータを保持します。中間プロセスがクライアント 1 から新しいデータを受信していない場合、クライアント 2 に待機するように指示します。
この OS を独立させようとしているので、何を使用すればよいかわかりません。MPI の使用を検討しましたが、実際にはこの目的に適合していないようです。Boost.ASIO、名前付きパイプ、RPC、および RCF についても調査しました。現在 Windows でプログラミングしていますが、コードが Linux でコンパイルされる可能性があるため、WIN_API の使用は避けたいと考えています。
ここでは、2 つのプロセスについてもう少し詳しく説明します。
中間プロセスを介して GUI (Qt で記述されたクライアント 2) から初期入力を受け取るバックエンド プロセス/モデル (クライアント 1) があります。その後、モデルは終了条件が満たされるまで処理を続行し、準備が整うとサーバーにデータを送信します。GUI は定期的に中間プロセスにデータを要求し、モデルがデータを更新していない場合は待機するように指示されます。モデルからデータが利用可能になると、ユーザーが選択した場合にファイルにエクスポートするために、現在のセッションからの以前のデータを保持できるようにすることも必要です (つまり、GUI がコマンドを発行するようにします)。データをエクスポート (またはロード) するためのインターフェイス)。
バックエンド/モデルの変更権限は、上で概説した設計に従う以外は最小限です。私はかなりの量の C++ の経験がありますが、並列/非同期アプリケーションの経験はあまりありません。どんな助けや指示も大歓迎です。
.net - MemoryBarriers と Parallel Extensions
Parallel Extensions を使用する場合、MemoryBarriers について考慮する必要はありますか?
編集 - 元の質問が自由回答形式だったので詳しく説明します: (@xanatos の回答は私が探していたものでした)
具体的な例を挙げると、Parallel.ForEach を使用し、各反復がクラス内のプロパティの値を設定するとします (各反復は独自の特定のプロパティを設定し、2 つの反復で同じプロパティの値を設定することはありません)。Parallel.ForEach を呼び出した同じスレッドで、Parallel.ForEach から設定されたプロパティにアクセスします。
java - セットの Java ConcurrentHashMap のパターン
私がマルチスレッド アプリケーションで一般的に使用するデータ構造は、すべて同じキーを共有する項目のグループを保存する ConcurrentHashMap です。この問題は、特定のキー値の最初のアイテムをインストールするときに発生します。
私が使用してきたパターンは次のとおりです。
この操作を行うためのより良いパターンはありますか? これもスレッドセーフですか?Set
よりも内側に使用するのに適したクラスはありjava.util.HashSet
ますか?
java - Javaで並行プログラミングをマスターする
並行プログラミングをマスターしたい。
DougLeaによるjavaの同時プログラミングのための良い本があると聞きました
どの本を最初に読むべきですか?他に本はありますか。誰かが私にこのトピックをどのように実践するかを教えてくれるなら。
java - Android/Java スレッドのスリープ
暗黙のユーザー インターフェイス スレッドと並んで、2 つのスレッド (ランナブル) を作成しました。どちらも内部に while ループがあり、実装したメッセージ キュー内の更新を定期的にチェックします。
最初の問題は、2 つの while ループが無限であり、デバイスのほとんどすべての CPU を使い果たすほど急速に変化することでした。そのため、各サイクルの後に while ループを約 100 ミリ秒スリープさせて、他のスレッドが作業できるようにすることを考えましたが、別の問題に遭遇しました。
今、問題は、スレッドが 100 ミリ秒スリープすることですが、その間は UI スレッドを動作させません:( そして、これにより UI が遅くなります。画面上で何かをドラッグすると、少し遅れます。
だから私がやりたいのは、これらのスレッド (これらの while ループ) が 100 ミリ秒ごとにメッセージ キュー フラグをチェックするようにすることですが、その 100 ミリ秒の間に UI スレッドを実行させたいのです。これはどのように達成できますか?
編集1
現在のスレッドの実行を停止するyieldメソッドを見つけましたが、いつこれを呼び出すのですか? スリープ スレッドを呼び出し、同時に何らかの方法で生成する必要があります ... ??
編集2
2 つのクラスはシングルトンであり、アプリケーションの最初のアクティビティから開始するため、アプリの開始時 (UI スレッド)
そして、それぞれの中run()
に次のコードがあります:
erlang - key-to-pid メカニズムを使用する場合の一時的な gen_servers 状態の保存を処理します
キーに関連付けられている一時的な gen_servers 状態の保存を処理する方法を知りたいです。
キーをプロセスに関連付けるために、pidstore というプロセスを使用します。Pidstore は最終的にプロセスを開始します。Key と M、F、A を pidstore に渡すと、グローバルでキーが検索され、見つかった場合は pid が返されるか、MFA が適用され ({ok, Pid} が返される必要があります)、Pid がキーに登録されます。グローバルで、Pid を返します。
おそらく巨大な状態の非アクティブな gen_servers が多数ある可能性があります。したがって、handle_info コールバックを設定して状態をデータベースに保存し、プロセスを停止しました。gen_servers はスーパーバイザーでは一時的なものと見なされるため、何かが再び必要になるまで再起動されません。
ここで問題が発生します: {car, 23} を表すプロセスで handle_info を保存するステップで、{car, 23} などのキーを使用してプロセスを呼び出すと、意図したとおりに pid が返されます。プロセスは保存中で、終了していません。したがって、gen_server:call でプロセスを呼び出しますが、プロセスが停止しているため、応答がありません (デフォルトの 5 秒のタイムアウトに達します)。(問題A)
この問題を解決するには、プロセスをグローバルから登録解除し、その状態を保存してから停止します。ただし、登録解除後、保存が完了する前に必要な場合は、新しいプロセスをロードします。このプロセスは、更新されていない値をデータベースにロードする可能性があります。(問題B)
これを再度解決するために、データベースへの読み込みと保存がキューに入れられ、同時に実行できないようにすることができました。これがボトルネックになる可能性があります。(問題C)
私は別の解決策を考えています.私のプロセスは、保存する前に、ビジーであることをpidstoreに伝えることができます. pidstore は、使用中のプロセスのリストを保持し、これらのキーに対するすべての要求に対して「使用中」と応答します。保存が完了すると、pidstore はプロセスによって no_more_busy と通知され、キーを要求されたときに新しいプロセスを開始できます。(古いプロセスが終了していなくても、保存が完了しているため、一人で死ぬのに時間がかかる場合があります)。
これは少し面倒に思えますが、可能性のあるタイムアウトを処理するために gen_server へのすべての呼び出しをラップする代わりに、キーから Pid を取得するためにいくつかの試行を行う方が簡単に感じます。(プロセスが終了しているが、まだグローバルに登録されている場合)。
これらの半分の問題と半分の解決策のすべてについて、私は少し混乱しています。この状況で使用する設計は何ですか、またはこの状況を回避するにはどうすればよいですか?
私のメッセージが判読できることを願っています。英語のエラーについても教えてください。
ありがとうございました
concurrency - きめ細かいロックを使用するコード例 (JCR Jackrabbit?)
私は、ツリーのようなデータ構造を維持する並行プログラムのために、きめの細かいロック機能の実装を支援するプログラミング ツールを開発しようとして学術研究を行っています。
たとえば、プログラマーは、ツリーのルート ノードを受け取り、ツリーを変更する関数を作成することができます (いくつかのルートをたどり、ノードを追加/削除することによって)。それらを解放できる場所-関数を同じツリーで同時に実行できます。
このような細粒度のロックが使用されている実際のコード例、またはパフォーマンスを向上させるために使用できるが、プログラマーが実装するのが面倒だった (たとえば、関数中にツリー全体をロックした) いくつかの実際のコード例を探しています。 -無駄なノードを解放せずに呼び出します)。
ツリー型のデータベースを使用する JCR と Jackrabbit について読み、JCR でノードをロックする方法を説明する記事を見つけました (例はありません): http://www.day.com/specs/jcr/2.0/17_Locking .html
私はデータベースのバックグラウンドが非常に少なく、Jackrabbit データベースと同時実行に関して何が許可され、何が許可されていないかを完全には理解していません。2 つのスレッドから同じノードにアクセスすることは許可されていませんが、異なるリポジトリについてはどうでしょうか? また、2 つの異なるクライアントが同じノードにアクセスしようとするとどうなりますか (たとえば、1 つは削除しようとし、もう 1 つはそれを変更しようとします。session.save() は失敗しますか?)。
ありがとう、オレン
multitasking - それは良いマーカーですか、それともAda95ではありませんか?
Ada95の次のコントローラー(保護されたオブジェクト)を考慮して、タスクがこれを呼び出し、待機マーカー(マーカー)が初期化の前に自然にWaiting()
選択マーカー()にすでに対応している場合は待機しないようにします。Selecting_Marker