Передайте несколько аргументов в std:: thread
Я прошу библиотеку <thread>
в стандарте С++ 11.
Скажите, что у вас есть такая функция, как:
void func1(int a, int b, ObjA c, ObjB d){
//blahblah implementation
}
int main(int argc, char* argv[]){
std::thread(func1, /*what do do here??*/);
}
Как вы передаете все эти аргументы в поток? Я пробовал перечислять такие аргументы, как:
std::thread(func1, a,b,c,d);
Но он жалуется, что такого конструктора нет. Один из способов обойти это - определить структуру для упаковки аргументов, но есть ли другой способ сделать это?
Ответы
Ответ 1
Вы буквально просто передаете их в std::thread(func1,a,b,c,d);
это должно было скомпилироваться, если объекты существовали, но это неправильно по другой причине. Поскольку объект не создан, вы не можете присоединиться или отключить поток, и программа не будет работать правильно. Поскольку он временный, деструктор вызывается немедленно, поскольку поток не присоединен или не отсоединен, но вызывается std::terminate
. Вы можете std::join
или std::detach
до того, как temp будет уничтожен, например, std::thread(func1,a,b,c,d).join();//or detach
.
Вот как это должно быть сделано.
std::thread t(func1,a,b,c,d);
t.join();
Вы также можете отсоединить поток, читая о потоках, если вы не знаете разницу между присоединением и отключением.
Ответ 2
Если вы получаете это, вы, возможно, забыли положить #include <thread>
в начало вашего файла. Подпись OP выглядит так, как будто она должна работать.
Ответ 3
Была такая же проблема. Я передавал неконстантную ссылку на пользовательский класс, и конструктор пожаловался (некоторые ошибки шаблона кортежа). Заменил ссылку на указатель и все заработало.