Как ‘std:: thread’ может определять количество переменных аргументов, передаваемых конструктору

#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 );
  

Как вы можете видеть, первый аргумент — это функция для запуска, а остальные — аргументы, которые должны быть переданы ей. Если они не совпадают, вы получаете какую-то ошибку компилятора