【发布时间】:2015-06-04 06:08:02
【问题描述】:
我正在使用boost::asio 和boost::filesystem 来执行一些简单的异步文件系统操作。
以下代码 sn-p 应该为它在递归此类目录的第一级中找到的每个目录生成一个新线程,依此类推,只要线程池中有线程可供使用。
编译器似乎没有识别出我通过引用传递了boost::asio::io_service,并抱怨:
main.cpp:51:51: Call to implicitly-deleted copy constructor of 'boost::asio::io_service'
我试过#define BOOST_ASIO_HAS_MOVE,所以它会认为它可以移动boost::asio::io_service,即使它真的被const &传递了,但无济于事。
包括:
#include <iostream>
#include <thread>
// Threadpool
#define BOOST_ASIO_HAS_MOVE
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
// Filesystem
#include <boost/filesystem.hpp>
主要:
int main(int argc, const char * argv[]) {
boost::asio::io_service ioservice;
boost::thread_group threadpool;
boost::asio::io_service::work work(ioservice);
unsigned int threads = std::thread::hardware_concurrency();
for(unsigned int i = 0; i < threads; ++i)
threadpool.create_thread(boost::bind(&boost::asio::io_service::run,
&ioservice));
ioservice.post(boost::bind(parallel_found_file,
ioservice, // Call to implicitly-deleted copy constructor of 'boost::asio::io_service'
APPS_DIR,
FILE_NAME));
threadpool.join_all();
ioservice.stop();
return 0;
}
功能:
static bool parallel_found_file(boost::asio::io_service & ioservice,
const boost::filesystem::path & dir_path,
const std::string & file_name)
{
if(!exists(dir_path))
return true;
boost::filesystem::directory_iterator end_itr;
for(boost::filesystem::directory_iterator itr(dir_path);
itr != end_itr;
++itr )
{
if(is_directory(itr->status()))
{
ioservice.post(boost::bind(parallel_found_file,
ioservice, // Call to implicitly-deleted copy constructor of 'boost::asio::io_service'
itr->path(),
file_name));
}
else
{
if(itr->path().filename().string().find(file_name)
!= std::string::npos)
{
return true;
}
}
}
return false;
}
编辑:
ioservice.post(boost::bind(parallel_remove_file,
boost::ref(ioservice),
boost::ref(APPS_DIR),
boost::ref(FILE_NAME)));
io_service.hpp:102:3: Static_assert failed "CompletionHandler type requirements not met"
boost::asio::io_service::post says:
处理程序的函数签名必须是:
void handler();
这是否意味着我无法从函数中传递或返回值?既然handler所需的签名不带参数也没有返回?
现在可以了,但是我真的很想知道为什么我不能传递参数或返回值,只能捕获变量,或者来自范围之外的变量:/
auto ioref = std::ref(ioservice);
ioservice.post([ioref]()
-> void
{ parallel_remove_file(ioref, APPS_DIR, FILE_NAME); });
【问题讨论】:
标签: c++ multithreading boost