問題タブ [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.
c++ - Win32 でのヒープの破損。見つける方法は?
ヒープを破損しているマルチスレッドC++ アプリケーションで作業しています。この破損を特定するための通常のツールは適用できないようです。ソース コードの古いビルド (18 か月前) は最新のリリースと同じ動作を示します。欠点としては、ソース デルタを使用して、バグがいつ導入されたかを特定できません。リポジトリには多くのコード変更があります。
クラッシュ動作のプロンプトは、このシステムでスループットを生成することです。つまり、内部表現に変更されたデータのソケット転送です。アプリに定期的に例外を発生させる一連のテスト データがあります (さまざまな場所、さまざまな原因 - ヒープ割り当ての失敗など: ヒープの破損)。
この動作は、CPU パワーまたはメモリ帯域幅に関連しているようです。マシンのそれぞれが多ければ多いほど、クラッシュしやすくなります。ハイパースレッディング コアまたはデュアルコア コアを無効にすると、破損の割合が減少します (ただし、完全にはなくなりません)。これは、タイミング関連の問題を示唆しています。
問題は次のとおりです:
軽量のデバッグ環境 (たとえばVisual Studio 98 / AKA MSVC6
) で実行すると、ヒープの破損はかなり簡単に再現できますalloc;
。洗練されたデバッグ環境 (Rational Purify、VS2008/MSVC9
または Microsoft Application Verifier でさえ) システムはメモリ速度の制約を受け、クラッシュしません (メモリの制約: CPU が を超えていない50%
、ディスク ライトが点灯していない、プログラムが可能な限り高速に動作している、ボックスが1.3G
2G の RAM を消費している) . したがって、問題を再現できる (ただし原因は特定できない) か、原因または再現できない問題を特定できるかの選択肢があります。
次の場所に関する私の現在の最良の推測は次のとおりです。
- 非常に汚れたボックスを取得します (現在の開発ボックスを置き換えるには: 2Gb RAM に
E6550 Core2 Duo
); これにより、強力なデバッグ環境での実行時に誤動作を引き起こすクラッシュを再現できるようになります。また - 演算子
new
andを書き換えて、 anddelete
を使用し、使用が終了したらすぐにメモリを読み取り専用としてマークします。実行して、解放されたメモリに書き込んでいる悪者を OS に捕まえさせます。はい、これは絶望のしるしです。一体誰が書き直しているのですか?! これにより、Purify などと同じくらい遅くなるのだろうか。VirtualAlloc
VirtualProtect
MSVC6
new
delete
いいえ、Purify インスツルメンテーションを組み込んで出荷することはできません。
同僚がちょうど通り過ぎて、「スタック オーバーフローですか? 今、スタック オーバーフローが発生していますか?!?」と尋ねました。
そして今、質問:ヒープ破損者を見つけるにはどうすればよいですか?
更新: バランスが取れてnew[]
おりdelete[]
、問題の解決に向けて長い道のりを歩んでいるようです. アプリがクラッシュするまでに 15 分ではなく、約 2 時間かかるようになりました。まだありません。さらに提案はありますか?ヒープの破損が続く。
更新: Visual Studio 2008 でのリリース ビルドは劇的に優れているようです。現在の疑惑は、にSTL
付属する実装にかかっていVS98
ます。
- 問題を再現します。
Dr Watson
さらなる分析に役立つ可能性のあるダンプが生成されます。
私はそれをメモしておきますが、ワトソン博士がつまずくのは事後であって、ヒープが踏みつけられたときではないことを懸念しています.
別の試み
WinDebug
は、非常に強力であると同時に軽量でもあるデバッグツールとして使用することです。
現時点では、これもうまくいきました。何かがうまくいかない限り、あまり助けにはなりません。行為中の荒らしを捕まえたい。
おそらく、これらのツールを使用すると、少なくとも問題を特定のコンポーネントに絞り込むことができます。
私はあまり希望を持っていませんが、絶望的な時代が求められています...
また、プロジェクトのすべてのコンポーネントが正しいランタイム ライブラリ設定 (
C/C++ tab
VS 6.0 プロジェクト設定のコード生成カテゴリ) を持っていることを確認しますか?
いいえ、そうではありません。明日、ワークスペース (58 個のプロジェクト) を調べて、それらがすべてコンパイルされ、適切なフラグでリンクされていることを確認するのに数時間を費やします。
更新: これには 30 秒かかりました。ダイアログですべてのプロジェクトを選択し
Settings
、適切な設定を持たないプロジェクトが見つかるまで選択を解除します (それらはすべて適切な設定を持っていました)。
multithreading - スレッド化プログラミングを学ぶための良いリソースは何ですか?
デスクトップでのマルチコア CPU の台頭により、マルチスレッド スキルはプログラマーにとって貴重な資産になります。スレッド化プログラミングについて学びたいと考えているプログラマーのために、いくつかの優れたリソース (書籍、チュートリアル、Web サイトなど) をお勧めできますか?
c# - イベント コールバックを Win フォーム スレッド セーフにするにはどうすればよいですか?
フォーム内からオブジェクトのイベントをサブスクライブすると、基本的にコールバック メソッドの制御がイベント ソースに渡されます。そのイベント ソースが別のスレッドでイベントをトリガーすることを選択するかどうかはわかりません。
問題は、コールバックが呼び出されたときに、フォーム上でコントロールを更新できると想定できないことです。これは、フォームが実行されたスレッドとは異なるスレッドでイベント コールバックが呼び出された場合、これらのコントロールが例外をスローすることがあるためです。
performance - マルチコア マシンでのマルチスレッド アプリケーションのスケーリング
より多くのパフォーマンスが必要なプロジェクトに取り組んでいます。時間の経過とともに、(スレッドと分散の両方で) より並列に動作するように設計を進化させ続けてきました。その後の最新のステップは、その一部を 16 コアの新しいマシンに移動することでした。共有メモリ モデルでこれほど多くのコアにスケーリングする方法を再考する必要があることがわかりました。たとえば、標準のメモリ アロケータでは十分ではありません。
人々はどのリソースを推奨しますか?
これまでのところ、Sutter のコラム Dr. Dobbs が良い出発点であることがわかりました。The Art of Multiprocessor Programming と Intel Threading Building Blocks に関する O'Reilly の本を手に入れました
c# - 続行する前にスレッドの完了を待つ方法は?
.NET CF 2.0 でスレッドを開始するためのコードがいくつかあります。
これをループ内で呼び出すと、アイテムが完全に順不同になります。t.Start()
コードが続行する前にスレッドでの作業が完了するように、 の後に待機を導入するにはどうすればよいですか? スレッドを手動で作成するよりも、BeginInvoke/EndInvoke の方が適切なオプションでしょうか?
c++ - C ++でのシングルトンのスレッドセーフな遅延構築
次のような C++ でシングルトン オブジェクトを実装する方法はありますか。
- スレッド セーフな方法で遅延構築します (2 つのスレッドが同時にシングルトンの最初のユーザーになる可能性がありますが、構築は 1 回だけにする必要があります)。
- 事前に構築されている静的変数に依存しません (そのため、静的変数の構築中にシングルトン オブジェクト自体を安全に使用できます)。
(私は自分の C++ を十分に理解していませんが、コードが実行される前に整数および定数の静的変数が初期化される場合 (つまり、静的コンストラクターが実行される前であっても - それらの値はプログラムで既に「初期化」されている可能性があります)もしそうなら - おそらくこれは、シングルトンミューテックスを実装するために悪用される可能性があります - これは、実際のシングルトンの作成を保護するために使用できます..)
すばらしい、私は今、いくつかの良い答えを持っているようです (残念ながら、2 つまたは 3 つを答えとしてマークすることはできません)。2 つの大まかな解決策があるようです。
- POD 静的変数の静的初期化 (動的初期化ではなく) を使用し、組み込みのアトミック命令を使用して独自のミューテックスを実装します。これは私の質問でほのめかしていた解決策のタイプであり、私はすでに知っていたと思います.
- pthread_onceやboost::call_onceなどの他のライブラリ関数を使用します。これらは確かに知りませんでした-そして、投稿された回答に非常に感謝しています.
c# - マルチコアテキストファイルの解析
私はクアッドコアマシンを持っていて、4つのコアすべてを利用するテキストファイルを解析するためのコードを書きたいと思っています。テキストファイルには、基本的に1行に1つのレコードが含まれています。
マルチスレッドは私の得意分野ではないので、ファイルを最適な方法で解析するために使用できるパターンを誰かが教えてくれるかどうか疑問に思っています。
私の最初の考えは、すべての行をある種のキューに読み込んでから、スレッドをスピンアップして行をキューから引き出して処理することですが、それはキューがメモリに存在する必要があり、これらはかなり大きなファイルなので、私はmその考えにはそれほど熱心ではありません。
私の次の考えは、行を読み取り、解析するスレッドを割り当てるある種のコントローラーを用意することですが、スレッドが行を処理する速度よりも速く行を処理している場合、コントローラーがボトルネックになるかどうかはわかりません。それらを読んで割り当てます。
私はおそらくこれらの両方よりも別の簡単な解決策があることを知っていますが、現時点ではそれを見ていません。
c# - C# 静的コンストラクターはスレッドセーフですか?
言い換えれば、このシングルトン実装はスレッドセーフですか?
c# - C#で「ロックを試み、タイムアウトした場合はスキップする」操作はありますか?
オブジェクトをロックしようとする必要があり、既にロックされている場合は続行します (タイムアウト後、またはそれなしで)。
C# の lock ステートメントがブロックされています。