Вы связываете нестатическую функцию-член класса,
поэтому вам нужно указать объект, для которого
функция-член вызывается. this
отсутствует
во всех звонках bind
:
std::packaged_task<int()> t(std::bind(&CommandChannel::p_impl_theDiv, this, a, b));
сделать то же самое для theMul
и theAdd
.
Вторая проблема, packaged_task
объект не может быть скопирован,
если вы хотите передать этот объект в качестве параметра
push_back
Вы должны разыграть packaged_task
объект
Rvalue ссылка, тогда packaged_task
будет перемещен
в вектор.
comm_ch_task_queue.push_back(std::move(t));
Все вышеизложенное устраняет ошибки при компиляции.
1)
Поскольку packaged_task
перемещается в методе theDiv
,
Вы не можете вызывать членов для этого объекта после выполнения операции перемещения.
После нажатия packaged_task
вы должны выйти из функции theDiv
.
void CommandChannel::theDiv(int a, int b)
{
/* Create the packaged tasks with the pimpl */
std::packaged_task<int()> t(std::bind(&CommandChannel::p_impl_theDiv, this, a, b));
/*Pushing the task in the queue thorigh the mutex locks*/
{
std::lock_guard<std::mutex> locker(commChannelmu);
comm_ch_task_queue.push_back(std::move(t));
commChannelcv.notify_one();
}
// access to t is forbidden
}
Сделайте то же самое с методами theAdd
и theMul
.
2) Ваша функция потока выполняет только одну задачу из очереди.
Я думаю, что какая-то петля там отсутствует. Вы хотите выполнить все входящие задачи в очередь (подробности в комментариях):
void CommandChannel::threadHandler()
{
std::packaged_task<int()> t;
while (true) // inifite loop to process incoming tasks
{
std::unique_lock<std::mutex> locker(commChannelmu);
commChannelcv.wait(locker,[this](){ return comm_ch_task_queue.size();});
// wait returns if there is some task to be performed
t = std::move(comm_ch_task_queue.front());
comm_ch_task_queue.pop_front();
std::future<int> f = t.get_future();
t(); // perform task
std::cout << f.get() << std::endl; // print value
}
}