delphi - 线程读取数据的关键部分

标签 delphi thread-safety critical-section

我有两个不同的线程(除了主线程)。

第一个向主线程发送带有数据的PostMessage。主线程收到消息后修改相应的全局变量(不同类型)。

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

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

最佳答案

如果您使用临界区(锁)保护对共享变量的所有访问,您的代码将是安全的。

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

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

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

对齐的重要性在于,如果一个变量未对齐,那么该变量的写入可能不是原子的。该变量可以写成两部分。因此读取线程可以读取部分更新状态的变量。始终对齐变量。如果您不打包记录和类,您的变量将会对齐。

最终我无法确定您的代码是否安全,因为您没有显示它。代码的描述仅到此为止。您确实应该针对这样的问题发布代码。

关于delphi - 线程读取数据的关键部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494653/

相关文章:

delphi - IdHTTP 基本身份验证访问冲突

delphi - 如何将 Delphi ListView.Columns[0] 设置为右对齐?

java - 关于java线程+同步的具体问题

java - 如何在使用RentrantLock完成所有三个 map 的初始化之前避免读取,并在更新完成后返回更新的 map 集?

c++ - 共享内存的强大 CRITCAL_SECTION?

delphi - 我应该何时以及如何混淆我的 Delphi 代码?

delphi - 如何解决 Delphi 2010 : "[DCC Error] E2223 $DENYPACKAGEUNIT ' OleAuto' cannot be put into a package"? 中的此错误

android - 服务关闭时的操作顺序

c# - 与每个对象关联的临界区是如何初始化的?

c# - 如何在 C# 中使用多个变量锁定作用域