問題タブ [multithreading]

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.

0 投票する
6 に答える
8627 参照

windows - ディスクから良好な同時読み取りパフォーマンスを得る方法

質問をしてから、自分の回答でフォローアップしたいのですが、他の人がどのような回答をしているかも確認したいと思います。

2 つの別々のスレッドから同時に読み取りたい 2 つの大きなファイルがあります。一方のスレッドは fileA を順次読み取り、もう一方のスレッドは fileB を順次読み取ります。スレッド間でロックや通信は行われず、両方とも可能な限り高速に順次読み取りを行い、読み取ったデータをすぐに破棄します。

Windows でのこのセットアップの経験は非常に貧弱です。2 つのスレッドを合わせたスループットは、2 ~ 3 MiB/秒のオーダーです。ドライブは、ほとんどの時間を 2 つのファイル間で前後にシークしているように見えます。おそらく、各シーク後にほとんど読み取っていません。

スレッドの 1 つを無効にして、一時的に 1 つのスレッドのパフォーマンスを調べると、帯域幅が大幅に向上します (このマシンでは ~45 MiB/秒)。したがって、2 スレッドのパフォーマンスが悪いのは、明らかに OS ディスク スケジューラの影響です。

同時スレッド読み取りのパフォーマンスを改善するためにできることはありますか? おそらく、別の API を使用するか、OS ディスク スケジューラのパラメーターを何らかの方法で微調整することによります。

いくつかの詳細:

ファイルは、2 GiB の RAM を搭載したマシン上でそれぞれ 2 GiB のオーダーです。この質問の目的のために、それらはキャッシュされておらず、完全に最適化されていないと考えています。これが事実であることを確認するために、最適化ツールを使用して再起動しました。

これらのファイルを読み取るために、特別な API は使用していません。この動作は、Win32 の CreateFile、C の fopen、C++ の std::ifstream、Java の FileInputStream など、さまざまなボグ標準 API で再現可能です。

各スレッドはループ内でスピンし、read 関数を呼び出します。各反復で API から要求されるバイト数を、1KiB から 128MiB までの値に変更しました。これを変更しても効果がないため、各ディスク シーク後に OS が物理的に読み取っている量は、この数値によって決定されないことは明らかです。これはまさに期待すべきことです。

1 スレッドと 2 スレッドのパフォーマンスの劇的な違いは、Windows 2000、Windows XP (32 ビットおよび 64 ビット)、Windows Server 2003、およびハードウェア RAID5 の有無にかかわらず再現可能です。

0 投票する
15 に答える
25681 参照

c# - C#の変数へのアクセスは不可分操作ですか?

複数のスレッドが変数にアクセスできる場合、プロセッサが途中で別のスレッドに切り替わる可能性があるため、その変数からのすべての読み取りとその変数への書き込みは、「lock」ステートメントなどの同期コードで保護する必要があると私は信じています。書き込み。

ただし、Reflectorを使用してSystem.Web.Security.Membershipを調べていたところ、次のようなコードが見つかりました。

s_Initializedフィールドがロックの外部で読み取られるのはなぜですか?別のスレッドが同時にそれに書き込もうとしていませんか?変数の読み取りと書き込みはアトミックですか?

0 投票する
7 に答える
2639 参照

multithreading - マルチスレッド プログラムの分析

私たちのコードベースは数年前のもので、元の開発者は全員いなくなっています。非常に多くのスレッドを使用しますが、明らかな設計や共通のアーキテクチャ原則はありません。すべての開発者は独自のマルチスレッド プログラミング スタイルを持っていたため、キューを使用して相互に通信するスレッド、ミューテックスを使用してデータをロックするスレッド、セマフォを使用してロックするスレッド、プロセス内通信にオペレーティング システムの IPC メカニズムを使用するスレッドなどがあります。設計ドキュメントはなく、コメントはまばらです。コードをリファクタリングしたり、新しい機能を追加しようとすると、デッドロックやその他の問題が発生するようです。

では、スレッド間のすべての相互作用を分析して文書化するのに役立つツールや手法を知っている人はいますか? FWIW、コードベースは Linux の C++ ですが、他の環境用のツールについて知りたいです。


アップデート

これまでに寄せられた回答には感謝していますが、本質的に「ログ メッセージを追加し、何が起こっているかを把握し、修正する」というアドバイスよりも、より洗練された、または体系的なものを期待していました。シングルスレッド プログラムの制御フローを分析および文書化するためのツールは数多くあります。マルチスレッドプログラムで利用できるものはありませんか?


マルチスレッド アプリケーションのデバッグも参照してください。

0 投票する
3 に答える
4541 参照

c# - コンパクト フレームワーク/スレッド化 - オプションを選択すると、MessageBox が他のコントロールの上に表示されます

外部サーバーから一連の更新を取得してインストールするアプリに取り組んでおり、スレッド化の助けが必要です。ユーザーは次のプロセスに従います。

  • ボタンのクリック
  • メソッドは更新をチェックし、count が返されます。
  • 0 より大きい場合は、MessageBox.Show() を使用してインストールするかどうかをユーザーに尋ねます。
  • はいの場合、ループを実行し、各更新の run() メソッドで BeginInvoke() を呼び出して、バックグラウンドで実行します。
  • 私の更新クラスには、進行状況バーなどを更新するために使用されるいくつかのイベントがあります。

進行状況バーの更新は問題ありませんが、ユーザーが [はい] をクリックした直後に更新ループが開始されるため、MessageBox は画面から完全に消去されません (下のスクリーンショットを参照)。

  • 更新ループが始まる前にメッセージボックスを即座に非表示にするにはどうすればよいですか?
  • BeginInvoke() の代わりに Threads を使用する必要がありますか?
  • 別のスレッドで最初の更新チェックを行い、そのスレッドから MessageBox.Show() を呼び出す必要がありますか?

コード

スクリーンショット

Windows モバイルのバグ

0 投票する
4 に答える
707 参照

.net - マルチスレッド設計のベスト プラクティス

この問題を考えてみましょう: データベースから 100 件のレコードをフェッチ (たとえば) する必要があるプログラムがあり、それぞれのレコードについて Web サービスから更新された情報を取得する必要があります。このシナリオで並列処理を導入するには、次の 2 つの方法があります。

  1. 新しいスレッドで Web サービスへの各要求を開始します。同時スレッドの数は、何らかの外部パラメーターによって制御されます (または何らかの方法で動的に調整されます)。

  2. 小さなバッチ (それぞれ 10 レコードとしましょう) を作成し、各バッチを個別のスレッド (この例では 10 スレッド) で起動します。

どちらがより良いアプローチで、なぜそう思うのですか?

0 投票する
9 に答える
16237 参照

c# - .Net で ThreadPool を使用してはいけない場合は?

.Net で ThreadPool を使用してはいけない場合は?

最良のオプションは ThreadPool を使用することのようですが、その場合、それが唯一のオプションではないのはなぜですか?

これについてあなたの経験は何ですか?

0 投票する
7 に答える
7869 参照

winforms - WinForms では、他のスレッドから UI コントロールを更新できないのはなぜですか?

これには正当な(または少なくともまともな)理由があると確信しています。それは何ですか?

0 投票する
6 に答える
1566 参照

windows - Windows フォームのスレッド化とイベント - ListBox はすぐに更新されますが、プログレス バーには大きな遅延が発生します

私たちのチームは、古いものに代わる新しい採用ワークフロー システムを作成しています。私は、古いデータを新しいスキーマに移行する任務を負っています。スキーマが根本的に異なり、単純な TSQL スクリプトは適切なソリューションではないため、小規模な Windows フォーム プロジェクトを作成することでこれを行うことにしました。

作業を行うメインのシール クラス 'ImportController' は、次のデリゲート イベントを宣言します。

メイン ウィンドウは、新しいスレッドを使用してそのクラスの静的メソッドを開始します。

ImportProgressEvent 引数は、文字列メッセージ、進行状況バーの最大 int 値、および現在の進行状況 int 値を運びます。Windows フォームはイベントにサブスクライブします。

独自のデリゲートを使用して、この方法でイベントに応答します。

最後に、プログレス バーとリストボックスが更新されます。

問題は、ListBox が非常に迅速に更新されるように見えることですが、とにかくバッチがほぼ完了するまでプログレス バーは移動しませんか ??? 何が得られますか?

0 投票する
27 に答える
187730 参照

multithreading - マルチスレッドコードの単体テストはどのようにすればよいですか?

これまでのところ、マルチスレッド コードをテストするという悪夢を避けてきました。正常に実行するためにスレッドに依存するコードのテストについて、人々はどのように取り組んでいるのか、または 2 つのスレッドが特定の方法で相互作用する場合にのみ現れるこの種の問題のテストについて、人々はどのように取り組んでいるのかを尋ねたいと思います。

これは、今日のプログラマーにとって非常に重要な問題のように思えます。

0 投票する
5 に答える
12447 参照

asp.net - asp.net アプリケーションが ThreadAbortException をスローするのはなぜですか?

これは自明の質問です。

何も問題がないのに、なぜこれが私の try キャッチにバブルするのですか?

ログに何百回も表示されるのはなぜですか?

初心者の質問であることはわかっていますが、このサイトが検索ランキングを獲得して新規ユーザーを獲得する場合は、彼らに質問する必要があります