当通过Rcpp调用boost :: threadpool时,RStudio挂起

时间:2015-12-15 19:28:40

标签: c++ r boost rstudio

我在使用R Studio服务器通过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运行时,没有问题。我得到双重归来。但是,当我运行R Studio Server时,它会无休止地挂起,或者当它到达create_thread语句时崩溃。

我的版本信息是:

  • R:R version 3.1.1 (2014-07-10) -- "Sock it to Me"
  • R Studio:0.99.489
  • Linux:Linux Debian-Jessie 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux
  • 提升:1.55

1 个答案:

答案 0 :(得分:3)

这可能只是您使用线程代码在RStudio 中运行的成本。 RStudio本身正在使用Boost,并且还与R交谈 - 所以看起来两个事件队列正在混淆。我认为没有和他们交谈,你几乎无能为力。

我真的喜欢littler在命令行上运行更大的作业作为脚本。它自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 Attributes;你可能想在包目录中调用compileAttributes(); RStudio将对您的源包进行处理。