gpt4 book ai didi

c++ - 通过 Rcpp 调用 boost::threadpool 时 RStudio 挂起

转载 作者:行者123 更新时间:2023-11-30 02:34:48 25 4
gpt4 key购买 nike

我在使用 R Studio Server 通过 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 版本 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

最佳答案

这可能只是您在 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 将对您的源包执行此操作。

关于c++ - 通过 Rcpp 调用 boost::threadpool 时 RStudio 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com