简体   繁体   中英

C++ Boost::ASIO Thread Pool issue

I just created my Thread Pool for game server, but i got one error in compiling what i didn't know how to fix.

Error :

Connection/CConnection.cpp: In lambda function: Connection/CConnection.cpp:62:6: error: 'this' was not captured for this lambda function

Thread Pool declaration :

class Worker {
public:
    Worker(ThreadPool &s) : pool(s) { }
    void operator()();
private:
    ThreadPool &pool; 
};

// the actual thread pool
class ThreadPool {
public:
    ThreadPool(size_t);
    template<class F>
    void enqueue(F f);
    ~ThreadPool();
private:
    // need to keep track of threads so we can join them
    std::vector< std::unique_ptr<boost::thread> > workers;

    // the io_service we are wrapping
    boost::asio::io_service service;
    boost::asio::io_service::work working;
    friend class Worker;
};

template<class F>
void ThreadPool::enqueue(F f)
{
    service.post(f);
}

Function what use it :

void CConnection::handle()
{
     int i = 0;
     ThreadPool pool(4);
     pool.enqueue([i]
    {
     char * databuffer;
     databuffer = new char[16];
     for(int i = 0;i<16;i++)
     {
      databuffer[i] = 0x00;
     }
     databuffer[0] = 16;
     databuffer[4] = 1;
     databuffer[8] = 1;
     databuffer[12] = 1;
     asynchronousSend(databuffer, 16);
    });
}

Can someone tell me where, and what is problem ?

My guess is that asynchronousSend is a function in the CConnection class. To call function in object you have to capture this :

pool.enqueue([this] { ... });

As you see I've removed the capture of i as it's not needed, since you declare a local i inside the lambda.

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