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

Суть такая, есть некоторая симуляция модели, в которой создаются потоки для моделирования полета объекта
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мб, вектор объектов передается везде по ссылке.
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
IGHOR
@IGHOR Куратор тега Qt
Qt/C++ DEV/CTO
без кода getX() ничего не понятно
Вероятно эта функция не потоко безопасна
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы