Почему в потоке иногда неправильно берется переменная?

Суть такая, есть некоторая симуляция модели, в которой создаются потоки для моделирования полета объекта
void Simulator::Start(ModuleRls &RLS)
{
    for (uint i = 0; i < flyObjVector.size(); i++)
    {
        StreamFly *obj = new StreamFly(flyObjVector, RLS, i + 1);
        obj->start();
    }
}


Сам поток:

void StreamFly::run()
{
    for (int i = 0; i < 50; i++)
    {
        qDebug() << id << "[" << QThread::currentThreadId() << "]" << RLS->getX();
    }
}


Здесь я беру координату RLS для проверки работы, она равна 50(допустим)
В логе я вижу такую картину:
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
1 [ 0x1a88 ] 50
6 [ 0x1cf8 ] 2675932
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
6 [ 0x1cf8 ] 49351064
2 [ 0x1c78 ] 50
6 [ 0x1cf8 ] 6900
2 [ 0x1c78 ] 6900
6 [ 0x1cf8 ] 6900
2 [ 0x1c78 ] 6900
2 [ 0x1c78 ] 6900
6 [ 0x1cf8 ] 6900
2 [ 0x1c78 ] 6900
6 [ 0x1cf8 ] 6900
7 [ 0x1d00 ] 6900
4 [ 0x1de8 ] 6900
6 [ 0x1cf8 ] 6900
4 [ 0x1de8 ] 6900
6 [ 0x1cf8 ] 6900
2 [ 0x1c78 ] 6900
4 [ 0x1de8 ] 6900
6 [ 0x1cf8 ] 6900
7 [ 0x1d00 ] 6900
4 [ 0x1de8 ] 6900
8 [ 0x1d0c ] 6900
6 [ 0x1cf8 ] 6900


Какие-то потоки получают правильно параметр, но иногда даже в одном потоке может шалить координата.
Допустим поток №1 и в нем половина правильно выводится и половина не правильно.
Не понимаю в чем проблема. С потоками на QT начал работать недавно, не судите строго :)
И еще один вопрос, почему-то после окончания симуляции, поджирает память на 1-2 мб, смотря сколько объектов запущено, допустим 1800. Да, по коду звучит бредово, я генерирую 1800 потоков... Но суть не в этом. Почему после каждого запуска, прибавляется эти 1-2мб, вектор объектов передается везде по ссылке.
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 1
IGHOR
@IGHOR
Qt/C++ DEV/CTO
без кода getX() ничего не понятно
Вероятно эта функция не потоко безопасна
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
25 окт. 2020, в 17:30
39999 руб./за проект
25 окт. 2020, в 17:16
150000 руб./за проект
25 окт. 2020, в 17:09
19999 руб./за проект