Exemplo n.º 1
0
    thread_pool_os_executor<Scheduler>::thread_pool_os_executor(
            std::size_t num_punits, std::string const& affinity_desc)
      : scheduler_(nullptr),
        executor_name_(get_unique_name()),
        notifier_(get_notification_policy(executor_name_.c_str())),
        pool_(nullptr),
        num_threads_(num_punits)
    {
        if (num_punits > hpx::threads::hardware_concurrency())
        {
            HPX_THROW_EXCEPTION(bad_parameter,
                "thread_pool_os_executor<Scheduler>::thread_pool_os_executor",
                "max_punit shouldn't be larger than number of available "
                "OS-threads");
            return;
        }

        std::unique_ptr<Scheduler> scheduler(new Scheduler(num_punits));
        scheduler_ = scheduler.get();

        pool_.reset(new threads::detail::scheduled_thread_pool<Scheduler>(
            std::move(scheduler), notifier_, 0, executor_name_.c_str()));

        std::unique_lock<mutex_type> lk(mtx_);
        pool_->init(num_threads_, 0);

        if (!pool_->run(lk, num_threads_))
        {
            lk.unlock();
            HPX_THROW_EXCEPTION(invalid_status,
                "thread_pool_os_executor<Scheduler>::thread_pool_os_executor",
                "couldn't start thread_pool");
        }
    }
Exemplo n.º 2
0
    thread_pool_os_executor<Scheduler>::thread_pool_os_executor(
            std::size_t num_punits, std::string const& affinity_desc)
      : scheduler_(num_punits),
        executor_name_(get_unique_name()),
        notifier_(get_notification_policy(executor_name_.c_str())),
        pool_(scheduler_, notifier_, executor_name_.c_str()),
        num_threads_(num_punits)
    {
        if (num_punits > hpx::threads::hardware_concurrency())
        {
            HPX_THROW_EXCEPTION(bad_parameter,
                "thread_pool_os_executor<Scheduler>::thread_pool_os_executor",
                "max_punit shouldn't be larger than number of available "
                "OS-threads");
            return;
        }

        boost::unique_lock<mutex_type> lk(mtx_);

        // initialize the affinity configuration for this scheduler
        threads::policies::init_affinity_data data("pu", affinity_desc);
        pool_.init(num_threads_, data);

        if (!pool_.run(lk, num_threads_))
        {
            HPX_THROW_EXCEPTION(invalid_status,
                "thread_pool_os_executor<Scheduler>::thread_pool_os_executor",
                "couldn't start thread_pool");
        }
    }