При написании многопоточного приложения на c++ возникла необходимость передачи в функцию, которая выполняется в многопоточном режиме (multy), некоторое количество ссылок на вектора, которые для каждого потока имеют собственное значение. В результате компиляции вылетают ошибки:
Код консольного приложения ниже:
#include "pch.h"
#include "libraries.h"
#include "globalVariables.h"
//#include "multyThreadingFunc.h"
thread_local double centerOfMass = 0.0;
thread_local double templateZ;
vector<float> distanceAxis(n_bin + 1);
//here the total number of molecules in each bin is saved during the loop for the analyte molecules
vector<double> vectordensity(n_bin);
mutex mtx;
void multy(FILE &fid, int &amountOfAtoms, float &time, vector<float> &coordinates, vector<float> &changedCoord, double ¢erOfMass, double &templateZ, vector<double> &vectordensity) {
FILE *file = &fid;
...//some calculating
}
int main()
{
thread_local vector<float> coordinates(3); //x,y,z coordinates
thread_local vector<double> changedCoord;
FILE *fid = fopen("Benzene_Simu1_0_35ns.gro","rt");
if (fid == NULL) throw exception("Error was happend with the file");
float time;
for (int i = 1; i <= n_bin; i++) {
distanceAxis[i] = (i - 0.5)*BinWidth;
}
int startTime = clock();
while (true) {
std::thread thr(multy, ref(fid), &amountOfAtoms, &time, ref(coordinates), ref(changedCoord), ¢erOfMass, &templateZ, ref(vectordensity));
if (feof(fid)) break;
vectordensity[bin]++; //sorts the molecules according to their bins
//after finishing the loop, density contains the distribution of the molecules over all bins for all time steps
index++;
}
--index;
fclose(fid);
cout << endl << (endTime - startTime) / 1000 << endl;
return 0;
}
Написана какая-то ерунда при передаче аргументов в поток. Например, в функции потока параметр
int &amountOfAtoms
это ссылка на int, а при создании потока вы передаете туда
&amountOfAtoms
т.е. указатель на int. Эта ошибка присутствует и с другими параметрами. Неудивительно что компилятор не может вызвать функцию потока. Что характерно, ссылки на векторы вы передаете правильно, а ссылки на скалярные значения почему-то нет. Откуда такое деление?
С параметром fid вообще что-то непонятное творится. Почему передается ref(fid) (то есть фактически FILE *&), когда функция потока принимает FILE &? Что вообще такое FILE & и зачем вам понадобился этот FILE &? Почему вы не передаете сразу нормальный человеческий FILE *?
Также я у вас в коде не увидел никаких попыток сделать "некоторое количество ссылок на вектора, которые для каждого потока имеют собственное значение". Для того, чтобы у каждого потока было "собственное значение" вектора, надо для каждого потока создавать отдельный экземпляр вектора. Но я у вас этого нигде не вижу. Все потоки получают ссылки на одни и те же векторы. В частности, неясно, зачем вы у себя в коде наставили этих thread_local спецификаторов, если все потоки получают ссылки на одни и те же данные из главного потока и работают именно с ними.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости