問題タブ [concurrency]
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.
.net - Jeffrey Richter の PowerThreading ライブラリのどのクラスを使用していますか?
Jeffrey Richter は、人々が彼の PowerThreading ライブラリをどのように使用しているかについて、意見を求めています。誰かがこれを使用している場合、どの部分を使用していますか? 彼はライブラリをクリーンアップしようとしており、人々が使用しているクラスを知りたがっています。
http://www.wintellect.com/PowerThreading.aspx
編集: http://tech.groups.yahoo.com/group/PowerThreading/message/88を参照してください。
java - 指定されたタイムアウトを超えた場合に実行を強制終了できるように、メソッドをラップするにはどうすればよいですか?
呼び出したいメソッドがあります。ただし、実行に時間がかかりすぎる場合は、それを強制終了するか、強制的に戻すためのクリーンで簡単な方法を探しています。
私はJavaを使用しています。
説明する:
TestExecutor
クラスはimplement Callable
その方向に進むべきだと思います。
しかし、私ができることは、executor.execute()
時間がかかりすぎる場合は停止することだけです.
提案...?
編集
寄せられた提案の多くは、実行中のメソッドに時間がかかり、何らかのループが含まれており、変数が定期的にチェックされる可能性があることを前提としています。しかし、そうではありません。したがって、必ずしもクリーンであるとは限らず、どこにいても実行を停止するだけのものは許容されます。
java - Java HashMap でのスレッドの問題
可能であるべきかどうかわからないことが起こりました。私はそれを見たので、明らかにそうですが、根本的な原因を見つける必要があり、皆さんが助けてくれることを望んでいました.
郵便番号の緯度と経度を検索するシステムがあります。毎回アクセスするのではなく、安価なインメモリ HashTable キャッシュに結果をキャッシュします。これは、郵便番号の緯度と経度がリリースよりも頻繁に変更されない傾向があるためです。
とにかく、ハッシュは、両方とも同期されている「get」メソッドと「add」メソッドを持つクラスに囲まれています。このクラスにはシングルトンとしてアクセスします。
これが最良のセットアップだと主張しているわけではありませんが、それが私たちの目標です。(できるだけ早く Collections.synchronizedMap() 呼び出しで Map をラップするように変更する予定です。)
このキャッシュをマルチスレッド環境で使用し、2 つの zip に対して 2 つの呼び出しをスレッド化します (2 つの間の距離を計算できるようにするため)。これらはほぼ同時に発生する場合があるため、両方の呼び出しが同時にマップにアクセスする可能性が非常に高くなります。
つい最近、2 つの異なる郵便番号が同じ値を返すというインシデントが発生しました。初期値が実際に異なっていたと仮定すると、Map に値を書き込むと、2 つの異なるキーに対して同じ値が書き込まれる可能性はありますか? または、2 つの「取得」がワイヤを交差させて誤って同じ値を返す可能性がある方法はありますか?
私が持っている他の唯一の説明は、初期データが破損していた (間違った値) ということですが、それはほとんどありそうにありません。
どんなアイデアでも大歓迎です。ありがとう、ピーター
(PS: 詳細情報やコードなどが必要な場合はお知らせください)
java - スレッド化されたコードとスレッド化されていないコードのパフォーマンスの比較
次のコードを想定して、スレッド関連の質問がいくつかあります。コードの非効率性の可能性は無視してください。私はスレッド部分にのみ関心があります。
このようなコードを実行すると、約 56 秒かかります。ただし、次のコードがある場合 (代替として):
全体の操作には約 7 秒かかります。一度に 1 つのスレッドしか作成しない場合でも、別のスレッドが作成されたときにスレッドが終了するとは限らないことはほぼ確実です。そうですか?私も興味があります: 操作がすぐに終了するのはなぜですか?
スレッドに参加しているときに、他のスレッドがバックグラウンドで実行され続けているか、それとも参加しているスレッドだけが実行中ですか?
multithreading - スレッドの安全性を確保するための最適なプログラミング アプローチ/方法論
基本、Pascal、COBOL、および C を使用した約 20 年間の手続き型プログラミングのバックグラウンドから Java を学んでいたとき、当時、最も難しいのは OOP の専門用語と概念に頭を悩ませることだと考えていました。堅実な Java を約 8 年間使用してきた今、Java や C# などの類似言語でのプログラミングで最も難しいのは、マルチスレッド/同時実行の側面であるという結論に達しました。
信頼性が高くスケーラブルなマルチスレッド アプリケーションをコーディングするのは非常に困難です。また、プロセッサが高速化ではなく「幅広」に成長する傾向にあるため、プロセッサは急速に重要になってきています。
もちろん、最も困難な領域は、スレッド間の相互作用と、その結果生じるバグ (デッドロック、競合状態、古いデータ、および遅延) を制御することです。
では、私の質問は次のとおりです。デッドロック、レイテンシ、およびその他の問題の可能性を軽減しながら、安全な並行コードを生成するためにどのようなアプローチまたは方法論を採用していますか? 少し型にはまらないアプローチを思いつきましたが、いくつかの大規模なアプリケーションで非常にうまく機能しました。これは、この質問に対する詳細な回答で共有します.
mysql - ファイルシステムVSRDMBS(MySQL)を使用した同時実行処理
私は、ユーザーが単語を入力して定義を取得できる英語のWeb辞書を作成しています。私はしばらくこれについて考えましたが、データは100%静的であり、一度に1つの単語しか取得できなかったため、MySQLを使用して定義を格納するのではなく、データベースシステムとしてファイルシステム(ext3)を使用する方が適切でした。MySQLに接続する必要があり、それ自体が非常に遅い操作であることを考えると、オーバーヘッドが少なくなると思いました。
私の恐れは、もし私のシステムが例えば500ワード/秒の検索で攻撃されたとしても、データベースとしてファイルシステムを使用したほうがよいのではないかということです。または、MySQLが内部で行っている可能性があることとは対照的に、ファイルシステムの読み取りが増えるとパフォーマンスが低下しますか?
現在、階層は単語の最初の文字、2番目の文字、3番目の文字で分割されています。したがって、「水」の定義を検索する場合、スクリプト(PHP)は「../dict/w/a/t/water.word」から読み取ろうとします(問題のある文字の単語をクリーンアップした後、小文字)
私はこれで正しい方向に向かっていますか、それともより速い解決策がありますか(memcachedのようなものを使用してメモリに定義を保存することを数えません)?ディレクトリに保存されるファイルの量はパフォーマンスに影響しますか?ディレクトリに保存する必要のあるファイル数の大まかなベンチマークは何ですか?
c# - SerialPort と BSOD
ポートでコマンドを発行して応答をリッスンすることにより、SerialPort にデバイスが存在するかどうかを確認する C# コードをいくつか作成しました。ポート速度を設定し、ポートを開き、シリアル ストリームを取得して処理を開始すると、常に 100% 動作します。ただし、一部のデバイスは異なる速度で動作するため、接続を自動ネゴシエートし、デバイスの存在を検出するために、さまざまな速度でデバイスをプローブしようとしています。
これらすべてを単一のスレッドで実行しても問題はありません。ただし、10 の速度での 3 秒のタイムアウトは、シリアル ポートごとに 30 秒であり、いくつかある場合があります。したがって、すべてのポートを同時にプローブする必要があります。
時々これはうまくいきます。時々 Vista のブルースクリーン。スレッドを使用してすべてのポートを同時にプローブすると、ほぼ常にブルースクリーンになります。すべてを 1 つのスレッドで強制的に実行すると、決して起こりません。
USB シリアル Prolific PL-2303 アダプターが x64 ドライバーで使用されています。
@Vinko - ミニダンプの読み取りに関するヒントをありがとう。
私が知る限り、問題の核心は、別のスレッドから新しい非同期 I/O 操作を開始することで、オーバーラップした I/O にまったく新しい意味を与えることができ、ドライバー内で競合状態が引き起こされることです。ドライバーはカーネル モードで実行されるため、BLAM!
エピローグ
キックオフを除き、コールバック ハンドラーの外部で BeginXxx を使用しないでください。また、EndXxx を呼び出すまで BeginXxx を呼び出さないでください。カーネル モードで実行されるドライバー コードで競合状態が発生するためです。
あとがき
これはソケットストリームにも当てはまることがわかりました。
multithreading - 「スレッドセーフ」という用語の意味は何ですか?
2 つのスレッドが基になるデータを同時に変更できないということですか? それとも、複数のスレッドがそのコード セグメントを実行しているときに、特定のコード セグメントが予測可能な結果で実行されるということですか?
c++ - 並行データ構造設計
高スループットの C++ サーバーで使用するのに最適なデータ構造を考え出そうとしています。データ構造は、数個から数百万個のオブジェクトを格納するために使用され、ソートは必要ありません (ただし、一意のソート キーは非常に安価に提供できます)。
要件は、効率的な挿入、理想的には O(1)、適度に効率的な削除、および効率的な走査をサポートできることです。検索操作をサポートする必要はありません (削除に必要な場合を除きます)。
ねじれは、他のスレッドがデータ構造を列挙している間、変更に関してスレッドセーフでなければならないということです。これは、単純な赤黒ツリーが機能しないことを意味します。1 つのスレッドは、他のスレッドが保持しているカーソルを台無しにせずに要素を挿入 (および必要なツリーの回転を実行) できないためです。
読み取り/書き込みロックを使用して、すべての読み取りが終了するまで書き込み操作を延期することは受け入れられません。リーダーが存在する間に発生する挿入がそのリーダーに表示されるかどうかは問題ではありません。
メモリ フットプリントも非常に重要であり、小さい方が明らかに優れています。
どのような提案がありますか?
コメントへの対応:
答えてくれてありがとう。
いいえ、挿入は既存の反復子を無効にすることはできません。イテレーターは、新しい挿入を確認する場合と確認しない場合がありますが、挿入が行われなかった場合に表示されるすべてのものを確認する必要があります。
削除が必要ですが、より高いレベルのルールにより、削除可能な項目で反復子が停止しないことを保証できます。
カーソルのノードごとのロックは、パフォーマンスに大きな影響を与えます。一度に多数のスレッドが読み取られる可能性があり、複数のスレッドがロックで使用しているあらゆる種類のメモリ ホット スポットにより、メモリ帯域幅が失われます (困難な方法を発見したように!)。InterlockedIncrement を呼び出す複数のスレッドを持つ単純なリーダーの数でさえ、きれいにスケーリングできません。
リンクされたリストがおそらく最良のアプローチであることに同意します。削除はまれであるため、O(1) 削除をサポートするためにバック ポインターのメモリ ペナルティを支払うことはコストがかかり、削除はバッチ操作になる傾向があるため、必要に応じて個別に計算する場合があります。
幸いなことに、ヘッド ポインターが変更される前に、挿入されたノードでポインターが更新されている限り、リンク リストへの挿入はリーダーのロックを必要としません。
ロック、コピー、ロック解除のアイデアは興味深いものです。関連するデータの量が大きすぎて、リーダーのデフォルトとして機能しませんが、ライターがリーダーと衝突するときに使用できます。読み取り/書き込みロックは構造全体を保護し、書き込みはリーダーと衝突した場合にデータ構造を複製します。書き込みは読み取りよりもはるかにまれです。
java - thread.start() の代わりに Java の thread.run() を呼び出すのはいつですか?
thread.run()
の代わりにJava を呼び出すのはthread.start()
いつですか?