2016-11-25 2 views
0

Стандартная функция std::async:Есть ли реализация std :: async, которая использует пул потоков?

Функция шаблона асинхронная запускает функцию п асинхронно (возможно, в отдельном потоке, который может быть частью пула потоков) и возвращает зЬй :: будущего, которое в конечном итоге хранения результата вызова этой функции.

Существует две пусковой политики std::launch::async and std::launch::deferred. В моем компиляторе (GCC 6.2) стандартное исправление библиотеки, первое всегда создает новый поток, а второй выполняет ленивую оценку на вызывающем потоке. По умолчанию используется std::launch::deferred.

Есть ли какая-либо реализация, которая использует пул потоков с размером, равным аппаратным потокам, доступным, если указан std::launch::async, чтобы избежать создания двух потоков, когда std::async используется в рекурсивном алгоритме?

+0

Возможный дубликат [Какие реализации std :: async используют пулы потоков?] (Https://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread -pools) –

ответ

1

Компилятор Microsoft и среда выполнения C++, поставляемая с Visual Studio.

0

я использую этот подход

class ThreadPool 
{ 
public: 
    ThreadPool(size_t n) 
     : work_(io_service_) 
    { 
     AddThreads(n); 
    } 
    /** 
    * \brief Adds \a n threads to this thread pool 
    * \param n - count of threads to add 
    */ 
    void AddThreads(size_t n) 
    { 
     for (size_t i = 0; i < n; i++) 
      threads_.create_thread(boost::bind(&boost::asio::io_service::run, &io_service_)); 
    } 
    /** 
    * \brief Count of thread in pool 
    * \return number 
    */ 
    size_t Size() const 
    { 
     return threads_.size(); 
    } 
    ~ThreadPool() 
    { 
     io_service_.stop(); 
     threads_.join_all(); 
    } 

    /** 
    * \brief Perform task \a pt. see io_service::post 
    * \tparam T - type with operator() defined 
    * \param pt - functional object to execute 
    */ 
    template <class T> 
    void post(std::shared_ptr<T> &pt) 
    { 
     io_service_.post(boost::bind(&T::operator(), pt)); 
    } 

    /** 
    * \brief Perform task \a pt. see io_service::dispatch 
    * \tparam T - type with operator() defined 
    * \param pt - functional object to execute 
    */ 
    template <class T> 
    void dispatch(std::shared_ptr<T> &pt) 
    { 
     io_service_.dispatch(boost::bind(&T::operator(), pt)); 
    } 

private: 
    boost::thread_group threads_; 
    boost::asio::io_service io_service_; 
    boost::asio::io_service::work work_; 
}; 

dispatch является asynk(..., async); post - asynk(..., deferred);

Смежные вопросы