1

Я пытался создать многопоточность для обработки 2 многомерных массивов:как передать многомерный массив в многопоточном C++

vector<thread> tt; 
for(int i=0;i<4;i++) tt.push_back(thread(th,arr1,arr2)); 

с резьбовой функцией:

void th(int arr1[3][100][100], int arr2[100][100]) { 
... 
} 

Я также попытался пройти мимо ссылка еще не получить его работы, а также:

void th(int (&arr1)[3][100][100], int (&arr2)[100][100]) { 
    ... 
    } 

Оба дает мне "no type named 'type' in 'class std::result_of void(* (int **[])...". Может кто-нибудь, пожалуйста, покажите мне, как правильно передавать многомерные массивы в многопоточности?

+4

Извлеките многопоточность и сосредоточьтесь на правильном использовании объявлений и вызовов. –

+0

'tt.push_back (thread (th, std :: ref (arr1), std :: ref (arr2)));' с ['std :: ref'] (http://en.cppreference.com/w/cpp/utility/functional/ref) и 'th' принимает ссылки на массивы (поэтому' void th (int (& arr1) [3] [100] [100], int (& arr2) [100] [100]) ') –

+0

http://ideone.com/RkR40P Посмотрите, насколько это просто с std :: array. Никогда не используйте необработанные массивы – stefan

ответ

2

Ваш оригинальный вызов функции пахнет странно для меня, но все-таки следующий вызов компилируется и работает нормально с g++-4.6.3 помощью команды

g++ -lpthread -std=c++0x -g multiArray.cc -o multiArray && ./multiArray 

Тогда multiArray.cc имеет

#include <iostream> 
#include <thread> 
#include <vector> 

void th(int ar1[3][100][100], int ar2[100][100]) 
{ 
    std::cout << "This works so well!\n"; 
} 

int main() 
{ 
    int ar1[3][100][100]; 
    int ar2[100][100]; 

    std::vector<std::thread> threads; 
    for(int ii = 0; ii<4; ++ii) 
    { 
     threads.emplace_back(th, ar1,ar2); 
    } 


    for(auto & t : threads) 
    { 
     if(t.joinable()) 
     { 
      t.join(); 
     } 
    } 
} 

Позвольте мне пояснить, что это код подозрительный; например, если вы измените размеры массива (без изменения размеров массива), этот код без проблем будет компилироваться.

+0

Спасибо. Можем ли мы также пройти по ссылке? – ChuNan

+0

Да, но зачем передавать указатель по ссылке? – user14717

+0

Я предполагаю, что это быстрее, если значения массива изменены? – ChuNan

Смежные вопросы