2011-12-09 5 views
0

私は、QueryPerformanceCounterにアクセスしてルーチンの実行時間を記録するコードを持っています。概ね:重要なセクションを持つInt64へのアクセスをラップする必要がありますか?

var 
    FStart, FStop : Int64 ; 
... 
QueryPerformanceCounter (FStart) ; 
... <code to be measured> 
QueryPerformanceCounter (FStop) ; 

<calculate FStop - FStart, update minimum and maximum execution times, etc> 

このロギングコードの一部はスレッド内にありますが、その一方で、派生結果にアクセスする表示UIがあります。私は、VCLスレッドがロギングコードにもアクセスしているのと同じ変数にアクセスする可能性があると考えます。 VCLはこれまでにデータを読み取ることはありません(また、読み込みの難読化はあまり深刻ではありません)が、ロギングコードはデータを読み書きし、時には別のスレッドから読み込むことがあります。

私は、QueryPerformanceCounter自体がスレッドセーフであると仮定します。

コードは問題の兆候なしで楽しく実行されましたが、クリティカルセクションのInt64カウンタへのアクセスをラップする必要があるのでしょうか?

また、クリティカルセクションアクセスのスピード違反は何ですか?

答えて

1

読み取りと書き込みの両方が関係しているときにマルチバイト非アトミックデータにアクセスすると、そのアクセスをシリアル化する必要があります。クリティカルセクション、ミューテックス、セマフォー、SRWロックなどを使用するかどうかはあなた次第です。

+0

OK。データに1つのスレッドしか書いていないという事実を利用できませんか?確かに、データを読み取る別のスレッドが部分的に更新された値を読み取る可能性がありますが、このアプリケーションではそれほど大きな影響はありません(読み取りスレッドは常に表示用のデータを読み取っていて、毎秒更新されるVCLスレッドです)。私が心配しているのは、ロックアップを引き起こす紛争です。アクセスの管理に費やされる時間が時間のオーバーヘッドなので、アクセス時間をシリアライズする必要がある場合は重要です。どれが最低の(時間)オーバーヘッドを持つオプション? – rossmcm

+0

あなたがしていることが 'Int64'値を表示していて何もしていなければ、データをシリアル化する必要はありません。実際にその価値に取り組んでいたなら、その完全性を保証するためにアクセスをシリアライズする必要があります。 –

関連する問題