Re[8]: COW and thread safety in Qt
От: Skorodum Россия  
Дата: 12.10.23 14:45
Оценка:
Здравствуйте, andyp, Вы писали:

A>Как он может за что-то отвечать, если у Foo внутри mutable члены, а работают с элементами контейнера через константный указатель? Контейнер даже не будет знать о том, что внутри одного из его объектов что-то поменялось.

Ок, получилось воспроизвести и для этого не нужны никакие потоки, но(!) только ипользуя функцию at, про которую явно сказано, что она только для чтения и никогда не делает глубокую копию.
  код
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>

int main(int, char *[])
{
    struct Foo
    {
        mutable int data = -1; // <- we are very 'smart'
    };
    const auto vector = QVector<Foo>{Foo()};
    [vector]{ // capture by value, this makes copy of QVector, but content is implicitly shared
        // function "at" must be used for read-only access,
        // since it returns const reference and never makes deep copy.
        // It is still possible to modify data marked as mutable and make
        // changes which affects other owners of implicitly shared data.
        vector.at(0).data = 42;
        //  foo[0].data = 42; // <- right way to do
    }();
    // Ops: our local constant data is modified in another place because COW is broken with mutable!
    qDebug() << vector.at(0).data;
    return 0;
}


A>Константный доступ тоже может требовать синхронизации, а тут эти две вещи спарены. Говорил же, ошибки дизайна имхо.

Если преднамеренно абьюзить константность и мутабельность, то много где чего сломать можно

P.S. Код из разряда тупых головоломок на собеседование...
Отредактировано 12.10.2023 14:57 Skorodum . Предыдущая версия . Еще …
Отредактировано 12.10.2023 14:55 Skorodum . Предыдущая версия .
mutable qt qvector cow
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.