gpt4 book ai didi

c++ - boost::shared_ptr 代码中的多线程错误

转载 作者:行者123 更新时间:2023-11-28 02:58:47 24 4
gpt4 key购买 nike

我正在使用 visual studio,并且在 boost::shared_ptr 代码的以下行中不断收到异常:

void release() // nothrow
{
if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
{
dispose();
weak_release();
}
}

我认为它是多线程,因为它发生时非常随机。我正在努力获取更多详细信息。

我分享一个unordered_map<std::string, boost::shared_ptr<MyClass>>在几个线程中。我认为错误是由于不同的线程同时访问unordered_map(线程不访问unordered_map的相同元素)。

MyClass 包含一个 unordered_map 和一个集合。线程将数字添加到这些数据结构中。所以如果我有:

class MyClass{
public:
void addToMap(double a, long b);
void addToSet(double c);
private:
unordered_map<double, long> a;
set<double> b;
}
  • 线程 1:处理 std::unordered_map<std::string, boost::shared_ptr<MyClass> > 的元素 1|
  • 线程 2:处理 std::unordered_map<std::string, boost::shared_ptr<MyClass> > 的元素 2|
  • 线程 3:处理 std::unordered_map<std::string, boost::shared_ptr<MyClass> > 的元素 3
  • 线程 4:处理 std::unordered_map<std::string, boost::shared_ptr<MyClass> > 的元素 4

我的代码中没有任何锁。有人可以建议我如何解决这个问题(即使这意味着让代码变慢)?我只需要在每个 MyClass 对象中插入互斥锁吗?然而,似乎是 MyClass 对象的 boost::shared_ptr 导致了异常?

我没有通过任何 boost::shared_ptr通过引用/指针的对象。

最佳答案

operator[]修改容器,因此并发访问是不安全的。您的程序存在数据竞争。一般来说,非 const标准库对象的成员函数对于同时访问是不安全的。 C++11 §23.2.2 列出了容器的一些特殊异常(exception):

1 For purposes of avoiding data races (17.6.5.9), implementations shall consider the following functions to be const: begin, end, rbegin, rend, front, back, data, find, lower_bound, upper_bound, equal_range, at and, except in associative or unordered associative containers, operator[].

2 Notwithstanding (17.6.5.9), implementations are required to avoid data races when the contents of the contained object in different elements in the same sequence, excepting vector<bool>, are modified concurrently.

所以对于 unordered_map , 多个线程同时调用 operator[] 是不安全的- 但他们同时访问容器中的不同对象是安全的。保护元素的查找就足够了,例如:

std::unique_lock<std::mutex> lk(some_mutex);
auto& foo = my_map["key"];
lk.unlock();
foo += 42;

或者,如果您只想访问 map 中的现有元素 - 而不是添加新的默认构造元素 - 您可以使用 find根据上述标准报价,无需外部同步。

关于c++ - boost::shared_ptr 代码中的多线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408173/

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