Многопоточность с классами в C ++ - PullRequest
0 голосов
/ 15 октября 2019

У меня проблема с потоками в C ++. Я хочу создать потоки, состоящие из метода члена класса с определенным назначенным объектом. Более того, объект другого пользовательского класса передается этому методу. Пожалуйста, найдите код ниже:

Grid an_chan(NX, NY, xmax, ymax);
an_chan.calc_paraFlow(anode);

Grid *ptr_grid = &an_chan;    

Variable T(Tin, Tinit, lambda_m, rho_m, Cp_m);
Variable *ptr_T = &T;

std::thread first (&Variable::initialize, ptr_T, ptr_grid);

first.join();

Вот прототип метода инициализации:

void Variable::initialize(Grid& grid_obj)

До того, как я попытался добавить поток, все работало как надо.

Мне просто интересно, если это не проблема компилятора? Может, что-то не так с моим кодом, я не могу заметить? Любые возможные исправления? Ниже я включил ошибку, возвращаемую компилятором. Как видите, я использую TDM GCC 5.1.0. Я использовал его с потоками раньше, и все работало вполне нормально.

В файле, включенном в C: /TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include / c ++ / thread: 39: 0, из main.cpp: 13: C: /TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c ++ / функционал: в экземпляре 'struct std :: _ Bind_simple (chal :: Variable, chal :: Grid)> ': C: /TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c ++ / thread: 142:59: требуется из 'std :: thread :: thread (_Callable &&, _Args && ...) [with _Callable = void (chal :: Variable :: *) (chal :: Grid &);_Args = {chal :: Variable &, chal :: Grid &}] 'main.cpp: 45: 61: требуется отсюда C: /TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/ c ++ / function: 1505: 61: ошибка: нет типа с именем 'type' в 'классе std :: result_of (chal :: Variable, chal :: Grid)>' typedef typename result_of <_Callable (_Args ...)>:: type result_type;^ C: /TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c ++ / функционал: 1526: 9: ошибка: нет типа с именем 'тип' в 'классе std :: result_of (chal :: Variable, chal :: Grid)> '_M_invoke (_Index_tuple <_Indices ...>)

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Поскольку ваша initialize функция принимает параметр по ссылке, вы должны заключить аргумент в std::ref.

std::thread first(&Variable::initialize, ptr_T, std::ref(*ptr_grid));
0 голосов
/ 15 октября 2019

Как упомянуто @ acraig5075:

Второй параметр конструктора std :: thread должен быть указателем на объект. Вы разыменовываете ptr_T.

После этого вы можете также связать функцию перед передачей в поток:

std::thread first(std::bind(&Variable::initialize, ptr_T, *ptr_grid));
...