首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RStudio在调用boost::线程池时挂起

RStudio在调用boost::线程池时挂起
EN

Stack Overflow用户
提问于 2015-12-15 19:28:39
回答 1查看 116关注 0票数 1

我在使用通过Rcpp调用本地库时遇到了问题。这有点让人费解,因为我在命令行从R调用它时没有问题。

我编写了一个分析库,它使用boost的线程池功能运行多个线程。我已经把所有的内容简化到了最基本的部分,也就是导致问题的最低限度代码--这段代码只是启动线程池中的线程,然后退出它们:

代码语言:javascript
复制
#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: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
  • boost:1.55
EN

回答 1

Stack Overflow用户

发布于 2015-12-15 19:59:05

这可能只是使用线程代码在RStudio中运行的成本。RStudio本身也在使用Boost来实现这一点,并且还与R进行了对话--因此,两个事件队列似乎被混淆了。我认为,除非和他们交谈,否则你无能为力。

我真的很喜欢利特勒,因为它在命令行上作为脚本运行更大的作业。自2006年以来,它一直是Debian的一部分,对您来说也只是一个apt-get

编辑:撇开Rcpp不说,您可以更简洁地编写函数,如

代码语言:javascript
复制
// [[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将对您的源代码包进行调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34297746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档