Я нашел threadpool , который, кажется, еще не воодушевлен, но я могу сейчас его использовать (если нет лучшего решения).
У меня есть несколько миллионов небольших задач, которые я хочу выполнить одновременно, и я хотел использовать threadpool
для планирования выполнения задач. Документация из threadpool
предоставляет (примерно) этот пример:
#include "threadpool.hpp"
using namespace boost::threadpool;
// A short task
void task()
{
// do some work
}
void execute_with_threadpool(int poolSize, int numTasks)
{
// Create a thread pool.
pool tp(poolSize);
for(int i = 0; i++; i < numTasks)
{
// Add some tasks to the pool.
tp.schedule(&task);
}
// Leave this function and wait until all tasks are finished.
}
Однако этот пример позволяет мне только планировать функции, не являющиеся членами (или задачи). Можно ли запланировать выполнение функции-члена?
Обновление:
ОК, предположительно, библиотека позволяет запланировать Runnable
для выполнения , но я не могу понять, где находится класс Runnable
, от которого я должен наследовать.
template<typename Pool, typename Runnable>
bool schedule(Pool& pool, shared_ptr<Runnable> const & obj);
Update2:
Я думаю, что выяснил, что мне нужно сделать: я должен сделать runnable, который будет принимать любые параметры, которые будут необходимы (включая ссылку на объект, у которого есть функция, которая будет вызываться), затем я использую функция статического расписания для планирования запуска на заданном threadpool
:
class Runnable
{
private:
MyClass* _target;
Data* _data;
public:
Runnable(MyClass* target, Data* data)
{
_target = target;
_data = data;
}
~Runnable(){}
void run()
{
_target->doWork(_data);
}
};
Вот как я планирую это в MyClass
:
void MyClass::doWork(Data* data)
{
// do the work
}
void MyClass::produce()
{
boost::threadpool::schedule(myThreadPool, boost::shared_ptr<Runnable>(new Runnable(myTarget, new Data())));
}
Однако в адаптере из библиотеки есть ошибка:
template<typename Pool, typename Runnable>
bool schedule(Pool& pool, shared_ptr<Runnable> const & obj)
{
return pool->schedule(bind(&Runnable::run, obj));
}
Обратите внимание, что для этого требуется ссылка на Pool
, но он пытается вызвать его так, как если бы он был указателем на Pool
, поэтому мне тоже пришлось это исправить (просто изменив ->
на * 1041) *).