2011-12-09 14 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锁等都取决于您。 OK。

+0

OK。我不能利用只有一个线程正在写入数据的事实吗?当然,读取数据的另一个线程可能会读取一个部分更新的值,但这在本应用程序中并不是太重要(读取线程始终是读取数据以供显示并每秒刷新一次的VCL线程)。我更担心的是造成锁定的冲突。如果我需要序列化访问时间非常重要,因为花在管理访问上的任何时间都是计时开销。哪些选项具有最低的(时间)开销? – rossmcm

+0

如果您所做的只是显示“Int64”的值,并且没有做任何其他操作,那么您就不需要序列化数据。如果您实际上是在根据价值行事,那么您将不得不序列化访问以确保其完整性。 –

相关问题