#c #multithreading #variadic-functions
#c #многопоточность #переменные-функции
Вопрос:
При вызове конструктора std::thread
вы передаете функцию и ее желаемые аргументы. Как std::thread
определить общее количество аргументов, предназначенных для передачи функции?
#include <iostream>
#include <thread>
void task(int i, char c, bool b)
{
return;
}
int main(int argc, char** argv)
{
std::thread t(task, 10, 'c', true); // these 3 arguments
t.join();
}
Комментарии:
1. Магия шаблона.
2. Он может использовать
sizeof...
Ответ №1:
std::thread
Конструктор реализован с использованием шаблона переменных:
template< class Function, class... Args >
explicit thread( Functionamp;amp; f, Argsamp;amp;... args );
Где:
Function
это тип вызываемого объекта, который будет вызываться потоком (будь то функция, лямбда-выражение, функтор и т. Д.).Args
это список типов в параметреargs
variadic.f
это фактический вызываемый объект, который будет вызывать поток.args
это список значений, которые будут переданыf
.
std::thread
затем может перенаправить args
на f
использование расширения пакета параметров, аналогичного f(args...);
. Сам компилятор, нет std::thread
, расширится args...
до фактических значений, т.Е.: f(arg1, arg2, ..., argN)
.
Таким образом, std::thread t(task, 10, 'c', true);
будет создан рабочий поток, который выполняет вызов, аналогичный to f(args...)
, который будет расширен до task(10, 'c', true)
.
Таким образом, аргументы std::thread
, которые вы передаете конструктору, должны соответствовать аргументам f
передаваемого вами вызываемого объекта, в противном случае код не будет скомпилирован.
Ответ №2:
std::thread
конструктор имеет вид
template< class Function, class... Args >
explicit thread( Functionamp;amp; f, Argsamp;amp;... args );
Как вы можете видеть, первый аргумент — это функция для запуска, а остальные — аргументы, которые должны быть переданы ей. Если они не совпадают, вы получаете какую-то ошибку компилятора