我有两个不同的线程(除了主线程)。
第一个向主线程发送带有数据的PostMessage。主线程收到消息后修改相应的全局变量(不同类型)。
另一个线程(第二个线程)定期读取这些变量。
在这种情况下(在主线程和第二个线程中)是否需要使用临界区以确保安全?
最佳答案
如果您使用临界区(锁)保护对共享变量的所有访问,您的代码将是安全的。
但是,如果变量正确对齐,不存储引用,并且不超过指针大小,那么您可以避免使用锁。
例如,如果您有一个包含计数的整数,那么您将不需要使用锁。您的写入线程可以安全地修改,并且读取线程永远不会遭受撕裂。如果您有多个写入线程,那么您可能需要使用锁或互锁函数。
如果您的变量是引用,那么您可能需要使用锁。如果您有多个变量形成一个复合变量,那么您将再次需要一个锁。
对齐的重要性在于,如果一个变量未对齐,那么该变量的写入可能不是原子的。该变量可以写成两部分。因此读取线程可以读取部分更新状态的变量。始终对齐变量。如果您不打包记录和类,您的变量将会对齐。
最终我无法确定您的代码是否安全,因为您没有显示它。代码的描述仅到此为止。您确实应该针对这样的问题发布代码。
关于delphi - 线程读取数据的关键部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494653/