2015-10-21 5 views
0

Я создаю программу с динамическим числом потоков. У меня есть вектор для потоков (спасибо, Мохамад); затем я пытаюсь вызвать функцию и передать несколько аргументов для потока выполнения.Массив потоков и попытка передать несколько аргументов функции не работают?

Однако мой текущий код дает ошибку, которую я предполагаю, из-за мое нечетное использование 2D-массив:

In function 'int main()': 102 77 [Error] no matching function for call to 'std::thread::thread(void (&)(float ()[2], float, int, int), float [(((sizetype)(((ssizetype)nodeNumber) + -1)) + 1)][2], float [(((sizetype)(((ssizetype)nodeNumber) + -1)) + 1)], int&, int&)'

102 77 [Note] candidates are: 4 0

133 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] template std::thread::thread(_Callable&&, _Args&& ...)

133 7 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] template argument deduction/substitution failed:

102 77 [Note] variable-sized array type 'float (&)[(((sizetype)(((ssizetype)nodeNumber) + -1)) + 1)][2]' is not a valid template argument

4 0 In file included from

128 5 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] std::thread::thread(std::thread&&)

128 5 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] candidate expects 1 argument, 5 provided

122 5 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] std::thread::thread() 122 5 c:\program files (x86)\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\thread [Note] candidate expects 0 arguments, 5 provided

Вот некоторые из кусков коды, где я пытаюсь это:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <thread> 
#include <vector> 
using namespace std; 


void map(float rank_matrix[][2], float adjacency_matrix[], int nodeNumber, int node); 

int main() { 
    // setup code, initialization section here 

     float adjacency_matrix[nodeNumber][nodeNumber]; 
     float rank_matrix[nodeNumber][2]; 

    while(iter < terminate) { 

     vector<thread> threads; 

     for(int i = 0; i < nodeNumber; i++) { 
      threads.push_back(std::thread(map, rank_matrix, adjacency_matrix[i], nodeNumber, i); 
     } 

     for(int i = 0; i < nodeNumber; i++) { 
      threads.join(); 
     } 

     // Flush out the mass for each node (will be updated based on mapper's work. 
     for(i = 0; i < nodeNumber; i++) { 
      rank_matrix[i][0] = 0; 
     } 

     iter++; 
     cout << endl; 
     cout << endl; 
    } 

    return 0; 
} 


// Mapper code for each individual node and computation. 
void map(float rank_matrix[][2], float adjacency_matrix[], int nodeNumber, int node) { 
    for(int i = 0; i < nodeNumber; i++) { 
     if(rank_matrix[node][1] != 0 && adjacency_matrix[i] > 0) 
      adjacency_matrix[i] = (rank_matrix[node][0]/rank_matrix[node][1]); 
    } 
} 

Любые предложения о том, что я делаю неправильно? Помощь будет очень признательна! Благодаря!

+1

Я редактировал сообщение об ошибке для вас. Вы всегда можете выбрать все, что хотите заблокировать, а затем нажать кнопку « – NathanOliver

+0

». Спасибо, я постараюсь запомнить это в следующий раз! – RecursionIsSexy

ответ

3
thread myThread[nodeNumber]; 

Это создает ряд по умолчанию инициализируются потоки т.е. нитей, которые не представляют какой-либо поток выполнения ,

myThread[i](map, rank_matrix, adjacency_matrix[i], nodeNumber, i); 

Не инициализирует свои темы.

Я хотел бы предложить использовать вектор потоков, как в этом example

std::vector<std::thread> threads; 

Это не создает каких-либо фактических потоков. Просто контейнер, чтобы держать их.

Тогда вы можете заполнить его следующим образом:

for(int i = 0; i < nodeNumber; i++) { 
    threads.push_back(std::thread(map, rank_matrix, adjacency_matrix[i], nodeNumber, i); 
} 
+0

Спасибо за ответ. Я попробовал ваше предложение, но я получаю эту ошибку: [Ошибка] нет функция совпадения для вызова в 'std :: thread :: thread (void (&) (float (*) [2], float *, int, int), float [(((sizetype) (((ssizetype) nodeNumber) + -1)) + 1)] [2], float [((sizetype) (((ssizetype) nodeNumber) + -1)) + 1)], int &, int &) ' – RecursionIsSexy

+0

Я включил библиотеку векторов. m интересно, не нравится ли мне моя функция карты. В принципе, adjacency_matrix - это 2D-массив, но я взломал его так, что я только передаю строки и выполняю вычисления. Он работает без использования потоков при его проверке. просто используя потоки для разделения работы между частями массива (используя узлы). – RecursionIsSexy

+0

По-видимому, массивы с переменным размером не являются допустимыми аргументами ..... :-( – RecursionIsSexy

2
myThread[i](map, rank_matrix, adjacency_matrix[i], nodeNumber, i); 

ли attemting позвонить оператору вызова функции на myThread[i] с подаваемыми параметрами не вызова конструктора. thread myThread[nodeNumber]; уже строит темы так, что вам нужно сделать, это назначить нить к каждому элементу массива

myThread[i] = thread(map, rank_matrix, adjacency_matrix[i], nodeNumber, i);