Использование boost :: asio :: post для функции, принимающей параметры - PullRequest
0 голосов
/ 05 марта 2020

Я новичок в использовании boost и threadpools. Я хочу передать функцию в пул потоков, который принимает переменную в качестве параметра. В этом простом примере я просто передаю целое число. Насколько я понимаю, пост собирается вызвать доступную ветку в пуле потоков, чтобы что-то сделать. Код компилируется, если я настроил printProduct так, чтобы он не принимал какие-либо переменные, но это не то, что я в итоге пытаюсь сделать.

Ссылки на соответствующую документацию были бы очень полезны (я не нашел подробного обсуждения boost :: asio :: post), а также советов о том, как решить проблему. Спасибо!

#include <cstdlib> 
#include <iostream>
#include <pthread.h>
#include <boost/version.hpp>    // version is 1.72
#include <boost/asio.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/thread_pool.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
#include <boost/lockfree/queue.hpp>

using namespace std;

int printProduct(int endval){
    // int endval = 1000000;
    int prod = 1;
    for (int i=0;i<endval;i++){
        prod = prod * i;
    }
    return prod;
}


int main() {

    boost::asio::thread_pool tp(8);

    for (int i =0; i<200; i++){
        // issue is how to pass the parameter into post
        boost::asio::post(tp, printProduct,i);
        // boost::asio::post(tp, printProduct(i));
    }
}

1 Ответ

3 голосов
/ 05 марта 2020

boost :: asio :: post принимает любой вызываемый объект. Требования к такому объекту вы можете найти здесь .

Есть много способов достичь того, что вы хотите:

[1] лямбда-выражения

boost::asio::post(tp, [i]{ printProduct(i); });

[2] bind

boost::asio::post(tp, std::bind(printProduct,i));

[3] пользовательский класс функторов

struct Wrapper {
    int i;

    Wrapper(int i) : i(i) {}

    void operator()() {
        printProduct(i);
    }
};

boost::asio::post(Wrapper{i});
...