Этот вопрос относится к this previous question.boost :: io_service post с использованием лямбда
Я реализовал код, опубликованный там Ричардом Ходжесом. Код, опубликованный для меня, когда я использую g++ (Debian 4.8.4-1) 4.8.4
.
Однако реализация является частью библиотеки CUDA, и я застрял с CUDA 6.5, который неофициально поддерживает функции C++ 11.
Когда я использую код Ричард отвечал:
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 "]"
со ссылкой на лямбда-линии. Это заставляет меня думать, что заголовок не обрабатывается должным образом. Я пробовал без шаблона, просто передавая ссылку на мой рабочий класс и без пересылки.
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 };
FYI, cuANN::trainer_pool
является 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;
};
- Что я делаю неправильно?
- Как это сделать, используя std :: bind или boost :: bind вместо использования лямбда?
PS: код на http://ideone.com/g38Z4H - мой скелет для g ++ (который работает). http://ideone.com/d7Nkop сохранен как host.cu
также демонстрирует проблему.
nvcc -std=c++11 host.cu -lboost_thread -lboost_system -lpthread -o host
Можете ли вы предоставить короткий полный код (так что мне не нужно копаться, чтобы попытаться угадать, что вы компилируете) вместе с точной командой компиляции, которую вы используете? –
Этот код используется в коде устройства? Если нет, то может быть выделена отдельная компиляция кода хоста и устройства. – havogt
@havogt это нужно запускать только на хосте, но я создаю его как библиотеку. –