c++ - 线程池类 : can't pass the args straight

标签 c++ multithreading c++11

我有一个可以找到类型的线程池 here .

我尝试执行以下操作:

/* Allocate a ThreadPool */
shared_ptr<SpinTools::ThreadPool> pool(new SpinTools::ThreadPool(4));

/* Start processing each image in Core container */
for (int img_idx = 0; img_idx < num_images; img_idx++) {

    pool->enqueue(_worker_task, img_idx, _args, _stats);

}

我的工作任务有以下原型(prototype):

void _worker_task(int img_idx, ProcessorArgs &args, Stats &stats)

但是这不会编译并且 MSVC 显示错误

Error   14  error LNK2019: unresolved external symbol "public: class std::future<void> __cdecl ThreadPool::enqueue<void (__cdecl&)(int,struct ProcessorArgs,struct SpinCore::Features::Stats &),int &,struct Sift::ProcessorArgs &,struct SpinCore::Features::Stats &>(void (__cdecl&)(int,struct ProcessorArgs,struct SpinCore::Features::Stats &),int &,struct ProcessorArgs &,struct SpinCore::Features::Stats &)" (??$enqueue@A6AXHUProcessorArgs@Sift@@AEAUStats@Features@SpinCore@@@ZAEAHAEAU12@AEAU345@@ThreadPool@SpinTools@@QEAA?AV?$future@X@std@@A6AXHUProcessorArgs@Sift@@AEAUStats@Features@SpinCore@@@ZAEAHAEAU45@1@Z) referenced in function "public: virtual void __cdecl Sift::process(void)" (?process@Sift@@UEAAXXZ) 

编辑:为 ThreadPool::enqueue 添加 header 以确保完整性:

template<class F, class... Args>
auto enqueue(F&& f, Args&&... args) 
    -> std::future<typename std::result_of<F(Args...)>::type>;

最佳答案

您需要将 ThreadPool::enqueue 的实现放在 header 中。如果仅在 .cpp 文件中(或至少早期版本不能),MSVC 无法生成实现

关于c++ - 线程池类 : can't pass the args straight,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27971533/

相关文章:

c - 需要关于多写入线程、单工作线程模型的建议

c++ - 使用 C++ 正则表达式库中的 regex_search

c++ - Arduino以太网字节大小问题

java - Java 中的同步银行模拟器

c++ - const 强制转换和指向指针的指针

multithreading - gcc参数: -pthread.它是做什么的?

C++从具有不同时区的字符串中解析日期时间

c++ - 是否存在将 double 转换为 long long 的优雅方法?

c++ - 使用 clang++ 编译时的警告

c++ - Poco NetSSL 异常