C ++ темы и методы класса. Проблема с утечкой памяти - PullRequest
0 голосов
/ 04 ноября 2019

У меня проблема с многопоточностью в C ++, я хочу параллельно вызывать один и тот же метод для разных объектов класса. Тем не менее, программа сталкивается с некоторыми проблемами с этим. Время от времени происходит сбой, иногда он проходит через часть кода, но всегда возвращает смехотворно большое число в качестве идентификатора, всегда на месте 0. Тело класса:

class Gas{
public:
    Gas(const int id, const int imax, const int jmax){
        id_ = id;
        NX_ = imax;
        NR_ = jmax;
    }
private:
    int id_;                            //id of specimen
    int NX_;                            //quantity of elements in the X direction
    int NR_;                            //quantity of elements in the R direction

    std::vector<double> fr_;            //molar fraction
    std::vector<double> ms_;            //mass source
    std::vector<double> ms_old_;        //mass source value from previous iteration - for source relaxation
};

Метод класса:

double Gas::initialize(){
        int i, j, k;
        fr_.resize(NX_ * NR_);
        ms_.resize(NX_ * NR_);
        ms_old_.resize(NX_ * NR_);

        std::cout << "ID: " << id_ << '\n';


        k = 0;
        for(i = 0; i < NX_; i++){
            for(j = 0; j < NR_; j++){
                fr_[k] = 0.01;
                ms_[k] = 0.;
                k++;
            }
        }
    }

Вот реализация потока в коде:

std::vector<Gas> gases;
std::vector<Gas*> ptr_gas(6);
for(i = 0; i < 6; i++){                                     //creating vector holding objects representing specific gases
        gases.push_back(Gas(i, 10, 5));
        ptr_gas[i] = &gases[i];
    }

std::vector<std::thread*> th_gas;
int i = 0;
for(auto &X : ptr_gas){
    std::thread *thr = new std::thread(&Gas::initialize, ptr_gas[i]);
    th_gas.push_back(thr);
    i++;
}

for(auto &X : th_gas){
    X->join();
    delete X;
}
th_gas.clear();     

Вывод std :: cout, который я поместил в метод, выглядит следующим образом:

ID: ID: 1
4999616
ID: 5
ID: 4
ID: 2
ID: 3

Похоже, что есть проблема с присоединением первого из созданных потоков. Любые предложения о том, как избежать этой проблемы? Я уже проверил адреса ptr_gas, и они верны.

1 Ответ

2 голосов
/ 04 ноября 2019
std::vector<Gas> gases;
std::vector<Gas*> ptr_gas(6);
for(i = 0; i < 6; i++){                                     //creating vector holding objects representing specific gases
        gases.push_back(Gas(i, grid));
        ptr_gas[i] = &gases[i];
    }

Ваши указатели в ptr_gas становятся «недействительными», потому что «газы» будут перераспределяться при нажатии push_back.

...