0

私が世界最高の Uber ハッカーで、プログラムの動作を監視する必要があるとします。

これを行うには、いくつかのスレッドを作成し、メモリからバイトを読み取るだけの動的ライブラリまたはプログラムを作成します (生のポインターまたは関数を使用しない他の直接メモリ取得モデルを介して)。この「はず」は安全ですか?あなたが得ることができる唯一のものは、不正な変数です(たとえば、読み取り時に書き込みが行われます)?無視して読み直したら?

競合状態、デッドロック、およびマルチスレッドに関連するその他の問題について取り上げているドキュメントを常に目にします。しかし、それらは常に私が望んでいるほど明確であるとは限らず、未回答の質問が残されています.

スレッドがメモリの一部に書き込み、3-4 などの他のスレッドが常にメモリを読み取り (非 std::atomic int または float を想定)、それを使用してスレッドスコープの操作を実行する場合 (速度の計算など)指定された x、y、z ベクトルの)、このプログラムは安全に実行され、定義された動作が発生しますか、または UB が発生するか、またはある時点でアプリケーションがクラッシュする可能性がありますか? (不正な float バイトの乗算がクラッシュを引き起こす可能性がありますか?)

安全でない場合、ターゲットプログラムの内部にアクセスせずに、いくつかのスレッドからメモリの一部からメモリの内容を「安全に」取得する方法はありますか?

4

2 に答える 2

2

主に公式の C++ の回答に関心がありますか、それとも実用的な回答に関心がありますか?

公式の C++ の回答は、ロックなしで同時に読み取りと書き込みを行うと、競合状態が発生する可能性があり、未定義の動作が発生する可能性があるというものです。

より実用的な答えは、適切に設計された CPU で発生する最悪の事態は、誤った値を取得することです。コードがロックなしでデータを読み取ろうとするのはバグですが、2 つのスレッドの読み取り/書き込みが競合しているために何かひどいことが起こるのであれば、(少なくとも) CPU 側のバグでもあります。変数の書き込みがアトミックでない場合、部分的に書き込まれた値を取得することはまったく問題ありませんが、マシンのクラッシュなどは CPU 側の重大なバグになります。

于 2013-07-06T05:56:26.820 に答える
2

複数のスレッドから同じデータオブジェクトを読み書きすると、未定義の動作が発生し、未定義の動作はクラッシュを強制するものではなく、単にプログラムが任意の動作を示すことができることを意味します。簡単に言えば、標準に従って義務付けられていないため、動作の一貫性に依存することはできません。

そのようなオブジェクトにアクセスする唯一の安全な方法は、次のことを確認することです。

  • ロックによるアトミック & 同期アクセス
于 2013-07-06T05:47:04.487 に答える