ошибка передачи вектора в функцию C++

248
08 февраля 2019, 04:40

При написании многопоточного приложения на c++ возникла необходимость передачи в функцию, которая выполняется в многопоточном режиме (multy), некоторое количество ссылок на вектора, которые для каждого потока имеют собственное значение. В результате компиляции вылетают ошибки:

  1. Severity Code Description Project File Line Suppression State Error C2672 'std::invoke': no matching overloaded function found
  2. Severity Code Description Project File Line Suppression State Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept()'

Код консольного приложения ниже:

#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 &centerOfMass, 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), &centerOfMass, &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;
}
Answer 1

Написана какая-то ерунда при передаче аргументов в поток. Например, в функции потока параметр

int &amountOfAtoms

это ссылка на int, а при создании потока вы передаете туда

&amountOfAtoms

т.е. указатель на int. Эта ошибка присутствует и с другими параметрами. Неудивительно что компилятор не может вызвать функцию потока. Что характерно, ссылки на векторы вы передаете правильно, а ссылки на скалярные значения почему-то нет. Откуда такое деление?

С параметром fid вообще что-то непонятное творится. Почему передается ref(fid) (то есть фактически FILE *&), когда функция потока принимает FILE &? Что вообще такое FILE & и зачем вам понадобился этот FILE &? Почему вы не передаете сразу нормальный человеческий FILE *?

Также я у вас в коде не увидел никаких попыток сделать "некоторое количество ссылок на вектора, которые для каждого потока имеют собственное значение". Для того, чтобы у каждого потока было "собственное значение" вектора, надо для каждого потока создавать отдельный экземпляр вектора. Но я у вас этого нигде не вижу. Все потоки получают ссылки на одни и те же векторы. В частности, неясно, зачем вы у себя в коде наставили этих thread_local спецификаторов, если все потоки получают ссылки на одни и те же данные из главного потока и работают именно с ними.

READ ALSO
Как заполнить QPainterPath

Как заполнить QPainterPath

Не понимаю как использовать void QPainterPath::setFillRule(Qt::FillRule fillRule)

228
Как создать один массив из двух

Как создать один массив из двух

Заданы массивы А (n) и В (m)Сформировать массив С (n + m), элементами которого являются n элементов массива A, за которыми следуют m элементов массива...

234
Пополнение баланса номера через API WebMoney

Пополнение баланса номера через API WebMoney

WebMoney предоставляет множество интерфейсов для разработчиковНо, к сожалению, я не смог найти подходящий мне

248
Неправильная генерация сертификата X.509

Неправильная генерация сертификата X.509

В проекте используется ЭП для подписания некоторых данных на формеПри тестировании локально на своем ПК (Windows) все происходит идеально: юзер...

249