Я предлагаю вам ознакомиться с документацией по функциям, которые вы используете. Из вашего комментария в ответе Джеймса Хопкина кажется, что вы не знаете, что делает boost :: bind, а просто скопировали код.
boost :: bind принимает функцию (назовите ее f) и, необязательно, несколько параметров и возвращает функцию, которая при вызове вызывает f с указанными параметрами.
То есть boost::bind(threadedAPI1, 0)()
(создание функции, которая не принимает аргументов и вызывает threadadedAPI1 () с аргументом 0, а затем ее вызов) эквивалентно threadedAPI1(0)
.
Поскольку ваши функции threadadedAPI на самом деле не принимают никаких параметров, вы не можете передавать им аргументы. Это просто фундаментальный C ++. Вы не можете вызвать threadedAPI1(0)
, но только threadedAPI1()
, и все же, когда вы вызываете функцию, вы пытаетесь (через boost :: bind) передать целое число 0 в качестве аргумента.
Итак, простой ответ на ваш вопрос - просто определить threadadedAPI1 следующим образом:
int threadedAPI1(int i);
Однако, один из способов избежать вызовов boost :: bind - это вызвать функтор вместо свободной функции при запуске потока. Объявите класс примерно так:
struct threadedAPI {
threadedAPI(int i) : i(i) {} // A constructor taking the arguments you wish to pass to the thread, and saves them in the class instance.
void operator()() { // The () operator is the function that is actually called when the thread starts, and because it is just a regular class member function, it can see the 'i' variable initialized by the constructor
cout << "Thread" << i << endl; // No need to create 4 identical functions. We can just reuse this one, and pass a different `i` each time we call it.
}
private:
int i;
};
Наконец, в зависимости от того, что вам нужно, простые потоки могут лучше подходить, чем пул потоков. В общем случае пул потоков запускает только ограниченное количество потоков, поэтому он может ставить в очередь некоторые задачи до тех пор, пока не завершится выполнение одного из потоков. Он в основном предназначен для случаев, когда у вас много краткосрочных задач.
Если у вас есть фиксированное количество задач с более длительным сроком действия, создание отдельного потока для каждого из них может быть подходящим вариантом.