多线程C/C++;变量无缓存(Linux)
我使用2个pthread,其中一个线程“通知”另一个线程一个事件,并且有一个变量(普通整数),由第二个线程设置 这是可行的,但我的问题是,是否有可能第一个(读取)线程没有立即看到更新,这意味着缓存没有直接更新?如果是这样,有没有办法防止这种行为,比如像java中的volatile关键字 (事件发生的频率大约在微秒范围内,因此或多或少需要立即进行更新)多线程C/C++;变量无缓存(Linux),c,linux,multithreading,synchronization,C,Linux,Multithreading,Synchronization,我使用2个pthread,其中一个线程“通知”另一个线程一个事件,并且有一个变量(普通整数),由第二个线程设置 这是可行的,但我的问题是,是否有可能第一个(读取)线程没有立即看到更新,这意味着缓存没有直接更新?如果是这样,有没有办法防止这种行为,比如像java中的volatile关键字 (事件发生的频率大约在微秒范围内,因此或多或少需要立即进行更新) /编辑:第二个问题:是否可以强制将变量保存在线程1所在的核心缓存中,因为该线程一直在读取该变量 我觉得您应该使用pthread条件变量作为信号机制
/编辑:第二个问题:是否可以强制将变量保存在线程1所在的核心缓存中,因为该线程一直在读取该变量 我觉得您应该使用pthread条件变量作为信号机制。这解决了您描述的所有问题。我觉得您应该使用pthread条件变量作为信号机制。这将解决您描述的所有问题。使用原子变量的更好方法。对于示例,您可以使用libatomic。volatile关键字不够 使用原子变量的更好方法。对于示例,您可以使用libatomic。volatile关键字不够 其他处理器可能无法立即看到它,但这不是因为缓存一致性。可见性的最大问题是由于处理器的方案或编译器在优化时重新排序指令 为了避免这两个问题,您必须使用。我相信大多数pthread原语都是自然的内存屏障,这意味着您不应该期望加载或存储移动到由lock和unlock调用形成的边界之外。volatile关键字还可以用于禁用某些编译器优化,这些优化在执行无锁算法时非常有用,但它不能替代内存障碍
也就是说,我建议您不要手动执行此操作,并且与无锁算法相关的陷阱相当多。把这些头痛的事情留给图书馆的作者应该会让你更快乐(除非你像我一样喜欢头痛:)。因此,我最后的建议是忽略我所说的一切,使用vromanov或David Heffman建议的方法。其他处理器可能无法立即看到它,但这不是因为缓存一致性。可见性的最大问题是由于处理器的方案或编译器在优化时重新排序指令 为了避免这两个问题,您必须使用。我相信大多数pthread原语都是自然的内存屏障,这意味着您不应该期望加载或存储移动到由lock和unlock调用形成的边界之外。volatile关键字还可以用于禁用某些编译器优化,这些优化在执行无锁算法时非常有用,但它不能替代内存障碍
也就是说,我建议您不要手动执行此操作,并且与无锁算法相关的陷阱相当多。把这些头痛的事情留给图书馆的作者应该会让你更快乐(除非你像我一样喜欢头痛:)。因此,我最后的建议是忽略我所说的一切,使用vromanov或David Heffman建议的方法。将信号从一个线程传递到另一个线程的最合适的方法应该是使用运行库的信号机制,如互斥体、条件变量、信号量等 如果这些有太高的开销,我的第一个想法是程序的结构有问题。如果事实证明这确实是瓶颈,并且重构程序是不合适的,那么我将使用编译器或合适的库提供的原子操作
使用普通的
int
变量,甚至是volatile
限定变量都容易出错,除非编译器保证它们具有适当的语义。e、 g.MSVC对普通加载和存储到volatile
变量的原子性和顺序约束做出了特别保证,但gcc没有。将信号从一个线程传递到另一个线程的最合适方式应该是使用运行库的信号机制,如互斥体、条件变量、信号量、,等等
如果这些有太高的开销,我的第一个想法是程序的结构有问题。如果事实证明这确实是瓶颈,并且重构程序是不合适的,那么我将使用编译器或合适的库提供的原子操作
使用普通的
int
变量,甚至是volatile
限定变量都容易出错,除非编译器保证它们具有适当的语义。e、 g.MSVC对volatile
变量的普通加载和存储的原子性和顺序约束做出了特别的保证,但gcc没有。C也有volatile
关键字,它告诉编译器变量可能“自行”更改(通过控制当前线程以外的其他对象)这样它就不会执行一些假设变量不会更改的优化。是的,但是volatile
不打算在C中用作线程构造。不,不是,但是如果您使用某个全局变量作为信号机制,它可以确保编译器不会优化您的测试。在原始意图的参数之外,事情通常是有用的。@cd但是缓存一致性呢?编译器优化似乎不是问题-线程“最终”会注意到更新。我所关心的是,核心缓存的更新速度不够快(=即时)。C具有v