[英]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
。
因此,我明確添加了this
和job
:
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;
};
PS: http : //ideone.com/g38Z4H上的代碼是我的g ++框架(有效)。 另存為host.cu
的http://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.