假设我们有一个全局
std::
容器。我希望向其中写入一些内容,然后让许多线程从中读取内容。初次写完后我不会更改它。
是否有什么因素阻止编译器通过将访问存储在寄存器或类似的东西中来简单地优化访问?这里有必要使用 volatile 这样的关键字吗?我如何保证容器上的操作始终真正提交到内存?
即使有锁之类的东西,我觉得这样的保证在某种程度上是必要的,在像 C 这样的语言中,我可能会通过使用
volatile
关键字来实现它们。
只要您具有写入和读取的释放获取语义,就应该很好。语义记录在这里:https://en.cppreference.com/w/cpp/atomic/memory_order
例如,如果您使用共享互斥锁(读取器/写入器锁),写入器线程采用独占锁,所有读取器线程采用共享锁,您将获得释放获取语义,并且您的读取将与写道:https://en.cppreference.com/w/cpp/thread/shared_mutex