提升线程池

Ton*_*ion 0 c++ boost threadpool

我正在尝试使用boost线程池库创建一个线程池,但在定义它时,我不断收到很多关于模板参数错误的错误.

我可能做了一些根本错误的事情,但我没有看到它?

//Threadpool
typedef boost::threadpool::thread_pool<
    boost::threadpool::task_func,
    boost::threadpool::fifo_scheduler<tsk>,
    boost::threadpool::static_size<boost::threadpool::fifo_pool>,
    boost::threadpool::resize_controller<boost::threadpool::fifo_pool>,
    boost::threadpool::wait_for_active_tasks<boost::threadpool::fifo_pool>
>  pool;
Run Code Online (Sandbox Code Playgroud)

错误:

------ Build started: Project: Trial, Configuration: Debug Win32 ------

Compiling...
Trial.cpp
error C2923: 'boost::threadpool::fifo_scheduler' : 'tsk' is invalid as template argument '#1', type expected
       see declaration of 'tsk'
 error C3200: 'boost::threadpool::fifo_pool' : invalid template argument for template parameter 'SizePolicy', expected a class template
error C3200: 'boost::threadpool::resize_controller<Pool>' : invalid template argument for template parameter 'SizePolicyController', expected a class template
        with
        [
            Pool=boost::threadpool::fifo_pool
        ]
error C3200: 'boost::threadpool::wait_for_active_tasks<Pool>' : invalid template argument for template parameter 'ShutdownPolicy', expected a class template
        with
        [
            Pool=boost::threadpool::fifo_pool
        ]
error C3200: 'boost::threadpool::fifo_pool' : invalid template argument for template parameter 'SizePolicy', expected a class template
        see reference to class template instantiation 'boost::threadpool::thread_pool<Task,SchedulingPolicy,SizePolicy,SizePolicyController,ShutdownPolicy>' being compiled
        with
        [
            Task=boost::threadpool::task_func,
            SchedulingPolicy=boost::threadpool::fifo_scheduler,
            SizePolicy=boost::threadpool::fifo_pool,
            SizePolicyController=boost::threadpool::resize_controller<boost::threadpool::fifo_pool>,
            ShutdownPolicy=boost::threadpool::wait_for_active_tasks<boost::threadpool::fifo_pool>
        ]
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(79) : error C3200: 'boost::threadpool::resize_controller<Pool>' : invalid template argument for template parameter 'SizePolicyController', expected a class template
        with
        [
            Pool=boost::threadpool::fifo_pool
        ]
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(79) : error C3200: 'boost::threadpool::wait_for_active_tasks<Pool>' : invalid template argument for template parameter 'ShutdownPolicy', expected a class template
        with
        [
            Pool=boost::threadpool::fifo_pool
        ]
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(91) : error C2059: syntax error : '<'
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(91) : error C2238: unexpected token(s) preceding ';'
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(92) : error C2059: syntax error : '<'
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(92) : error C2238: unexpected token(s) preceding ';'
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(111) : error C2146: syntax error : missing ';' before identifier 'size_controller'
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(111) : error C2501: 'boost::threadpool::thread_pool<Task,SchedulingPolicy,SizePolicy,SizePolicyController,ShutdownPolicy>::size_controller_type' : missing storage-class or type specifiers
        with
        [
            Task=boost::threadpool::task_func,
            SchedulingPolicy=boost::threadpool::fifo_scheduler,
            SizePolicy=boost::threadpool::fifo_pool,
            SizePolicyController=boost::threadpool::resize_controller<boost::threadpool::fifo_pool>,
            ShutdownPolicy=boost::threadpool::wait_for_active_tasks<boost::threadpool::fifo_pool>
        ]
c:\Program Files\boost\boost_1_44\boost\threadpool\pool.hpp(112) : warning C4183: 'size_controller': missing return type; assumed to be a member function returning 'int'

---------------------- Done ----------------------

    Build: 0 succeeded, 1 failed, 0 skipped
Run Code Online (Sandbox Code Playgroud)

Ste*_*e M 5

根据你的评论,tsk是一个变量.您不能将运行时表达式(例如变量)作为模板参数传递.模板完全是编译时.

对于这个特定问题,您只需要这样做:

typedef boost::threadpool::thread_pool<> pool;
void taskfunc();

// later on...
pool my_pool;
my_pool.schedule(&taskfunc);
Run Code Online (Sandbox Code Playgroud)

boost::threadpool::task_func只是一个boost::function0<void>- 任何0-arg void函数指针都可以转换为该类型.