Распределение потоков C ++ Boost Asio Pool с лямбда-функциями и передача по ссылочным переменным - PullRequest
0 голосов
/ 13 июля 2020

У меня есть лямбда-функция, которую я хотел бы опубликовать в пуле повышения. Лямбда-функция использует большой объект, который передается по ссылке. Однако я не могу заставить этот код работать должным образом.

#include <boost/asio.hpp>
#include <iostream>

int main() {
    int large_object = 10;
    auto f1 = [&large_object](int x) {
        std::cout << "this is a very large object that needs passed by ref " << large_object << std::endl;
        std::cout << x << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds {3});
        std::cout << "DONE SLEEPING!" << std::endl;
    };

    int processor_count = 2;  // consider that this CPU has two processors

    // Launch the pool with n threads.
    boost::asio::thread_pool pool(processor_count);

    int x = 2;
    // Submit a function to the pool.
    boost::asio::post(pool, [x]{f1(x);});

    pool.join();

    return 0;
}

Можно ли разместить эту лямбда-функцию в буст-пуле?

Спасибо за ваше время.

1 Ответ

1 голос
/ 13 июля 2020

Вам также необходимо захватить f1, как и другие переменные. Лямбда - это переменная:

 [x, f1]{f1(x);});

(или по ссылке)

Кстати, если вам нужно простое выполнение пула потоков, рассмотрите также std::async.

...