我在使用通过Rcpp调用本地库时遇到了问题。这有点让人费解,因为我在命令行从R调用它时没有问题。
我编写了一个分析库,它使用boost的线程池功能运行多个线程。我已经把所有的内容简化到了最基本的部分,也就是导致问题的最低限度代码--这段代码只是启动线程池中的线程,然后退出它们:
#include <Rcpp.h>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/thread.hpp>
RcppExport SEXP test_thread()
{
BEGIN_RCPP
double retdbl = 10.4;
boost::shared_ptr<boost::asio::io_service::work> threadpool_work;
boost::asio::io_service threadpool_io_service;
boost::thread_group threadpool_threads;
threadpool_work.reset( new
boost::asio::io_service::work(threadpool_io_service) );
for (int i = 0; i < 6; ++i) {
threadpool_threads.create_thread(
boost::bind(&boost::asio::io_service::run, &threadpool_io_service));
}
threadpool_io_service.stop();
threadpool_work.reset();
threadpool_threads.join_all();
return( Rcpp::wrap(retdbl) );
END_RCPP
}当我从命令行R跑的时候,没问题。我得到了双倍的回报。但是,当我通过run运行时,它要么没完没了地挂起,要么在到达create_thread语句时崩溃。
我的版本信息是:
R version 3.1.1 (2014-07-10) -- "Sock it to Me"0.99.489Linux Debian-Jessie 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux1.55发布于 2015-12-15 19:59:05
这可能只是使用线程代码在RStudio中运行的成本。RStudio本身也在使用Boost来实现这一点,并且还与R进行了对话--因此,两个事件队列似乎被混淆了。我认为,除非和他们交谈,否则你无能为力。
我真的很喜欢利特勒,因为它在命令行上作为脚本运行更大的作业。自2006年以来,它一直是Debian的一部分,对您来说也只是一个apt-get。
编辑:撇开Rcpp不说,您可以更简洁地编写函数,如
// [[Rcpp::export]]
double test_thread() {
double retdbl = 10.4;
boost::shared_ptr<boost::asio::io_service::work> threadpool_work;
boost::asio::io_service threadpool_io_service;
boost::thread_group threadpool_threads;
threadpool_work.reset( new
boost::asio::io_service::work(threadpool_io_service) );
for (int i = 0; i < 6; ++i) {
threadpool_threads.create_thread(
boost::bind(&boost::asio::io_service::run, &threadpool_io_service));
}
threadpool_io_service.stop();
threadpool_work.reset();
threadpool_threads.join_all();
return(retdbl);
}有关详细信息,请参阅Rcpp属性;您可能希望在包目录中调用compileAttributes();RStudio将对您的源代码包进行调用。
https://stackoverflow.com/questions/34297746
复制相似问题