简体   繁体   中英

send function pointer as function template in a threadpool class

I'm trying to use a ThreadPool implementation from this fellow: https://github.com/progschj/ThreadPool

I'm having trouble adding 'functions' to the enqueue method...here is the implementation for the enqueue method below:

// add new work item to the pool
template<class T, class F>
Result<T> ThreadPool::enqueue(F f)
{
    Result<T> res;
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        tasks.push_back(std::function<void()>(
        [f,res]()
        {
            CallAndSet<T,F>()(res, f);
        }));
    }
    condition.notify_one();
    return res;
}

Here's what I'm using:

#include "ThreadPool.h"
#include <stdio.h>
#include <iostream>

int main() {
    // create a thread pool of 4 worker threads
    ThreadPool pool(4);

    // queue a bunch of "work items"
    for(int i = 0; i < 8; ++i) {
        pool.enqueue([i] {
            std::cout << "hello " << i << std::endl;

            std::cout << "world " << i << std::endl;
        });
    }
}

It is part of the sample code that is trying to show how to use the library...

output from compilation is:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
g++ -o build/main.o -c -std=c++11 -pthread -Wall -g main.cpp
main.cpp: In function 'int main()':
main.cpp:15:7: error: no matching function for call to 'ThreadPool::enqueue(main()::<lambda()>)'
main.cpp:15:7: note: candidate is:
In file included from main.cpp:1:0:
ThreadPool.h:117:15: note: template<class T, class F> Result<T> ThreadPool::enqueue(F)
ThreadPool.h:117:15: note:   template argument deduction/substitution failed:
main.cpp:15:7: note:   couldn't deduce template parameter 'T'
scons: *** [build/main.o] Error 1
scons: building terminated because of errors.

I'm pretty clueless when it comes to templating stuff..I have no idea why the above won't work...anyone have any ideas?

cheers

jarrett

You have to specify T explicitly as it is not part of the argument list and thus can not be reduced.

 pool.enqueue<TheType>(functor);

I can not guess what T is supposed to be from the snippet alone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM