Потокобезопасность std::shared_ptr: разрулите спор
От: landerhigh Пират  
Дата: 22.01.16 13:11
Оценка:
Возник тут рабочий диалог.

Есть псевдокод
class PseudoClass
{
    std::shared_ptr<std::vector<Something>> m_DataMember;
    public:
    void SomeFunc()
    {
        //
        //
        m_DataMember = std::make_shared<std::shared_ptr<std::vector<Something>>>(getNewVectorOfSomething());
    }
    private:
    void RunInThread()
    {
        std::shared_ptr<std::vector<Something>> localCopy = m_DataMember;
        for (auto it = localCopy->begin(); it != localCopy->end(); ++it)
        {
            // This space is intentionally left empty
        }
    }
}


Соответственно SomeFunc() и RunInThread() выполняются в разных потоках.

Вопрос — оно безопасно?

Стандарт бает

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


Мой аргумент — data race в этом случае означает, что в случае, если две функции выполняются в параллель, мы не знаем, владеет ли localCopy "старыми" или "новыми" данными. На что нам по большому счету пофиг. Никаких других спецэффектов не ожидается, и data race не приводит к неприятностям.
А вот если бы мы делали вот такое вот

    void RunInThread()
    {
        for (auto it = m_DataMember->begin(); it != m_DataMember->end(); ++it)
        {
            // This space is intentionally left empty
        }
    }


то в случаем подмены объекта на полпути огребли бы по полной от инвалидировавшихся итераторов.

Вопрос больше теоретический, но все же.
www.blinnov.com
Отредактировано 22.01.2016 14:43 landerhigh . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.