如何解决可以使用c++20的atomic_ref并发访问用户类型成员函数吗?
考虑这个问题:我有一个用户类型的 atomic_ref
。我想同时访问它的成员函数。见下面的代码:
struct A{
int counter=0;
int add(){
++counter;
return counter;
};
};
int main() {
A a;
std::atomic_ref<A> ra{a};
std::vector<std::thread> v;
for(int i=0;i<1000;++i){
v.emplace_back([&ra]{ra.load().add();});
};
for(auto & t: v){t.join();};
std::cout<<a.counter<<std::endl;
};
最终输出是 0
,因为 load()
返回一个副本。有没有其他方法可以通过 atomic_ref
达到正确的结果?
而且我还想问一下,如果我们有一个 atomic_ref<T*>
,我们可以使用 load()
来访问成员函数,例如ra.load()->add()
。安全吗?代码会变成这样:
struct A{
int counter=0;
int add(){
++counter;
return counter;
};
};
int main() {
A* a=new A;
std::atomic_ref<A*> ra{a};
std::vector<std::thread> v;
for(int i=0;i<1000;++i){
v.emplace_back([&ra]{ra.load()->add();}); //Accessing member functions.
};
for(auto & t: v){t.join();};
std::cout<<a->counter<<std::endl;
};
在我的测试中,确实 1000
是正确的。
解决方法
原子并不神奇。它们只影响引用本身的加载和访问,而不影响虽然引用访问的任何内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。