gpt4 book ai didi

c++ - 多读/单写类的线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:20 24 4
gpt4 key购买 nike

我正在研究一个经常阅读但很少写的集合。

class A {
boost::shared_ptr<std::set<int> > _mySet;
public:
void add(int v) {
boost::shared_ptr<std::set<int> > tmpSet(new std::set<int>(*_mySet));
tmpSet->insert(v); // insert to tmpSet
_mySet = tmpSet; // swap _mySet
}
void check(int v) {
boost::shared_ptr<std::set<int> > theSet = _mySet;
if (theSet->find(v) != theSet->end()) {
// do something irrelevant
}
}
};

在类中,add()只被一个线程调用,check()被多个线程调用。 check() 不关心_mySet 是否是最新的。该类是线程安全的吗?执行 check() 的线程是否可能观察到 swap _mySetinsert to tmpSet 之前发生?

最佳答案

这是使用 shared_ptr 实现线程安全的有趣用法。是否可行取决于线程安全保证boost::shared_ptr。特别是,它是否建立了某种fence 或 membar,这样你就可以保证所有的写入set 的构造函数和 insert 函数出现在任何指针值的修改变得可见。

我在 Boost 中找不到任何没有线程安全保证智能指针的文档。这让我感到惊讶,因为我确信有一些。但是快速查看 1.47.0 的源代码显示没有,并且在线程环境中对 boost::shared_ptr 的任何使用都会失败。 (有人可以指出我所缺少的东西吗?我不能相信 boost::shared_ptr 忽略了线程。)

反正就是三种可能:不能使用共享指针在线程环境中(似乎是这种情况),共享指针确保其在线程环境中的内部一致性,但不建立关于其他对象的顺序,或者共享指针建立完整的排序。只有在最后一种情况下才会你的代码是安全的。在第一种情况下,您需要某种形式的锁定一切,然后,你需要某种fences 或 membar 以确保实际完成必要的写入在发布新版本之前,他们将在之前看到尝试阅读它。

关于c++ - 多读/单写类的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9171908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com