簡體   English   中英

使用lambda的boost :: io_service帖子

[英]boost::io_service post using a lambda

這個問題與先前的問題有關

我已經實現了Richard Hodges在此處發布的代碼。 當我使用g++ (Debian 4.8.4-1) 4.8.4時,發布的代碼對我g++ (Debian 4.8.4-1) 4.8.4

但是,該實現是CUDA庫的一部分,我被CUDA 6.5所卡住,后者非官方地支持C ++ 11功能。

當我使用Richard發布的代碼時:

template <class F>
void submit( F&& f)
{
    std::unique_lock<std::mutex> lock(_cvm);
    ++ _tasks;
    lock.unlock();
    _io_service.post(
    [this, f = std::forward<F>(f)]
                     {
                         f();
                         reduce();
                     });
}

我收到一個錯誤: error: expected a "]"引用lambda行。 這使我認為標頭未正確解析。 我嘗試了沒有模板,只是傳遞了對我的工作人員類的引用,並且沒有轉發。

void submit( trainer & job)
{
    std::unique_lock<std::mutex> lock(_cvm);
    ++ _tasks;
    lock.unlock();
    _io_service.post([this,&]
                     {
                         job();
                         reduce();
                     });
}

而且我得到一個error: an enclosing-function local variable cannot be referenced in a lambda body unless it is in the capture list

因此,我明確添加了thisjob

void submit( trainer & job)
{
    std::unique_lock<std::mutex> lock(_cvm);
    ++ _tasks;
    lock.unlock();
    _io_service.post([this,&job]
                     {
                         job();
                         reduce();
                     });
}

在這一點上,我陷入了錯誤:

error: could not convert '{{((cuANN::trainer_pool*)this)->cuANN::trainer_pool::_io_service}}' from '<brace-enclosed initializer list>' to 'boost::asio::io_service::work' boost::asio::io_service::work _work { _io_service };

僅供參考, cuANN::trainer_pool是Richard的示例中的worker_pool ,是線程池的實現,而_io_service只是class trainer_pool

class trainer_pool
{   
public:
    trainer_pool ( unsigned int max_threads );
    void start();
    void wait();
    void stop(); 
    void thread_proc();
    void reduce();
    void submit( trainer & job);

private:
    unsigned int _max_threads_;
    boost::asio::io_service _io_service;
    boost::asio::io_service::work _work { _io_service };
    std::vector<std::thread> _threads;
    std::condition_variable _cv;
    std::mutex _cvm;
    size_t _tasks = 0;
};
  1. 我究竟做錯了什么?
  2. 如何使用std :: bind或boost :: bind代替lambda來做到這一點?

PS: http : //ideone.com/g38Z4H上的代碼是我的g ++框架(有效)。 另存為host.cuhttp://ideone.com/d7Nkop也展示了該問題。

nvcc -std=c++11 host.cu -lboost_thread -lboost_system -lpthread -o host

這個構造:

[this, f = std::forward<F>(f)]

是c ++ 14,不會在c ++ 11中編譯。

使用[this, &]將是一個錯誤,因為不能保證函數對象仍然存在(您通過引用捕獲了它)

在c ++ 11中,考慮[this, f]進行復制。

編輯:剛剛意識到工作是可變的,因此:

void submit(trainer & job)
{
    std::unique_lock<std::mutex> lock(_cvm);
    ++ _tasks;
    lock.unlock();
    _io_service.post([this,job]()->void mutable
                     {
                         job();
                         reduce();
                     });
}

我發現了問題。 NVCC和CUDA可與lambda配合使用。

冒犯的行在標題中:

boost::asio::io_service::work _work { _io_service };

CUDA 6.5不喜歡初始化列表。 將其移至構造函數:

trainer_pool (unsigned int max_threads)
:_max_threads_(max_threads), _work(_io_service)
{}

似乎已解決該錯誤,並且現在可以編譯代碼。 非常感謝所有幫助的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM