2

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

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

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

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

4

1 回答 1

4

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

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

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

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

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

最终我不能确定你的代码是否安全,因为你没有展示它。代码描述仅到此为止。你真的应该为这样的问题发布你的代码。

于 2013-05-11T07:24:21.063 回答