是否有办法确保取消引用仅发生一次,并且来自取消引用的值只能从中加载/存储到一次?例如
class X {
public:
std::pair<int, int> p;
};
void bar(std::pair<int, int>);
void foo(X* pointer) {
auto pr = pointer->p;
bar(pr);
}
int main() {
auto&& go = std::atomic<bool>{false};
auto&& x = X{};
auto&& thread = std::thread{[&]() {
while (!go.load(std::memory_order_acquire)) {}
foo(&x);
}};
x = create();
go.store(true, std::memory_order_release);
thread.join();
}
对于编译器从指针加载多次是有效的,是否有办法确保加载仅发生一次?如果我在foo()
中添加volatile,则无法将取消引用的货币对传递给bar()
,因为我会将volatile
-ness从p
中删除。
在其中有用的一个示例是,如果您有一台已连接以从该设备的端口之一接收IO的设备。那么重要的是,您只能从指针读取一次。每次读取对设备意味着某种意义。此外,如果您还有其他不处理易失性类型的代码,则取消引用指针并将非易失性对象传递给外部代码将很重要。
答案 0 :(得分:-1)
也许您可以在foo函数之外再复制所需的内容,然后将该副本变量传递给函数。