gpt4 book ai didi

c++ - std::shared_ptr 在线程中使用时崩溃

转载 作者:行者123 更新时间:2023-11-28 07:17:21 25 4
gpt4 key购买 nike

在线程 1 中(释义代码):

std::vector<std::shared_ptr<Object>> list;

// Initialization
list.reserve(prop_count);

for (size_t i = 0; i < count; ++i)
{
list.push_back(std::shared_ptr<Object>());
}

// Looped code
for (auto iter = indexes.begin(); iter != indexes.end(); ++iter)
{
uint32_t i = *iter;

std::shared_ptr<Object> item = make_object(table->data[i]); // returns a shared_ptr of Object
list[i].swap(item);
}

在线程 2 中(释义代码):

for(auto iter = list.begin(); iter != list.end(); ++iter)
{
shared_ptr<Property> o(*iter);

if(o)
{
// some work with casting it
// dynamic_pointer_cast
}
} // <--- crashes here (after o is out of scope)

这是调用堆栈:

0x006ea218  C/C++
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)1>::_M_release(this = 0x505240) C/C++
std::__shared_count<(__gnu_cxx::_Lock_policy)1>::~__shared_count(this = 0xb637dc94) C/C++
std::__shared_ptr<Property, (__gnu_cxx::_Lock_policy)1>::~__shared_ptr(this = 0xb637dc90) C/C++
std::shared_ptr<Property>::~shared_ptr(this = 0xb637dc90) C/C++
startSending() C/C++
libpthread.so.0!start_thread() C/C++
libc.so.6 + 0xb52b8 C/C++

查看shared_ptr_base.h,好像这里崩溃了:

if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, -1) == 1)
{
_GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_use_count);
_M_dispose(); // <--- HERE

我不确定如何解决这个问题。任何帮助表示赞赏。谢谢!

最佳答案

来自 http://en.cppreference.com/w/cpp/memory/shared_ptr我强调的是:

If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur; the shared_ptr overloads of atomic functions can be used to prevent the data race.

在这种情况下,list[i]*iter是相同的实例。

对于线程1,推荐std::atomic_store(&list[i], item)而不是 list[i].swap(item)

对于线程2,推荐std::shared_ptr<Property> o(std::atomic_load(&*iter))而不是 std::shared_ptr<Property> o(*iter);

这一切都假设 vector 的大小不会改变,并引入容器的线程安全、迭代器失效等问题。不过,这超出了这个问题的范围,并在别处涵盖。

关于c++ - std::shared_ptr 在线程中使用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20023193/

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