通过线程读取数据的关键部分

时间:2013-05-11 06:59:21

标签: delphi thread-safety critical-section

我有两个不同的线程(在主线程旁边)。

第一个向主线程PostMessage发送数据。由于接收消息主线程修改了相应的全局变量(不同类型)。

另一个线程(第二个)定期读取这些变量。

在这种情况下(在主线程和第二线程中)是否需要使用临界区来确保安全?

1 个答案:

答案 0 :(得分:4)

如果您使用关键部分(锁定)保护对共享变量的所有访问权限,那么您的代码将是安全的。

但是,如果变量正确对齐,不存储引用,并且只有指针大小,那么您可以避免使用锁。

例如,如果您有一个包含计数的整数,那么您将不需要使用锁。您的写作线程可以安全地修改,阅读线程永远不会受到撕裂。如果你有多个写线程,那么你可能需要使用一个锁或一个互锁函数。

如果您的变量是引用,那么您可能需要使用锁。如果你有多个形成复合变量的变量,那么你还需要一个锁。

对齐的重要性在于,如果变量未对齐,则变量的写入可能不是原子的。变量可以分为两部分。因此读取线程可以读取部分更新状态的变量。始终对齐变量。如果你不打包打包记录和类,你的变量就会对齐。

最终,我无法确定您的代码是否安全,因为您没有显示它。代码的描述到目前为止。你真的应该发布你的代码来解决这个问题。