LINUX.ORG.RU

[Qt]QString readonly доступ из разных потоков

 


0

1

Уважаемые гуру,

Волнует вопрос: безопасно ли доступаться к одной QString в режиме readonly из разных потоков без мьютексов? Написал маленький тест, он работает, но все-таки хочется увидеть описание в документации/подтверждение: «да мол, все правильно, чувак, не боись». Я так понимаю, нужно копать в сторону implicit sharing & threads, но из этих нескольких абзацах ничего не понял:

http://doc.qt.nokia.com/qtopia4.2/threads.html#threads-and-implicit-sharing

больше информации не нашел.

Про контейнеры например явно сказано: «The container classes are implicitly shared, they are reentrant, and they are optimized for speed, low memory consumption, and minimal inline code expansion, resulting in smaller executables. In addition, they are thread-safe in situations where they are used as read-only containers by all threads used to access them.»

static QString commonString  = "abc";
class FooThread: public QThread
{
public:
    FooThread() : QThread(NULL) {}

    void run()
    {
        while (1) {
            QString qqq = commonString; // "copy" test
            if (commonString == qqq) { // "is similar to" test
                QString qqq = "horay";
            }
        }
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication _a(argc, argv);
    
    {
        FooThread a;
        a.start(QThread::HighestPriority);
        FooThread b;
        b.start(QThread::LowestPriority);
        std::cout << "Press any key to quit ";
        getch();
    }
}


Последнее исправление: LORd (всего исправлений: 1)

> implicitly shared classes in Qt 4 are really implicitly shared. Even in multithreaded applications, you can safely use them as if they were plain, non-shared, reentrant value-based classes

оно?

dt1 ★★
()
Ответ на: комментарий от dt1

Насколько я понял, тут лишь говорится, что всякие QString и пр. классы Qt4, которые реализуют COW, можно использовать как обычные, не грея голову на счет их внутренней реализации, синхронизуя доступ как и при работе с обычными объектами, когда это нужно.

Видимо тут скорее дело в том, что в своем примере я вызываю const методы, а у QString-а нет mutable параметров (и у ее shared data) тоже (http://stackoverflow.com/questions/362260/thread-safety-and-const).

Вот только где гарантия, что в Qt5 их не добавят? блин, как страшно жить

LORd
() автор топика
Ответ на: комментарий от LORd

ну в общем-то нет гарантии, что для контейнеров не сделают то же самое :)

только вероятность это очень мала

dt1 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.