Подтвердить что ты не робот

Передайте несколько аргументов в 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);

Но он жалуется, что такого конструктора нет. Один из способов обойти это - определить структуру для упаковки аргументов, но есть ли другой способ сделать это?

4b9b3361

Ответ 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

Была такая же проблема. Я передавал неконстантную ссылку на пользовательский класс, и конструктор пожаловался (некоторые ошибки шаблона кортежа). Заменил ссылку на указатель и все заработало.