0

我有兴趣编写一个能够运行 R 脚本的 c++ 程序。出于几个设计原因,我想创建一个 RInside 实例,执行脚本,获取结果,然后销毁该实例;都在一个线程中。我知道 R 不是多线程的,并且不能创建 RInside 的多个实例。但是我可以在隔离线程中创建单个实例吗?当我尝试这样做时,我的代码会编译,但在运行时出现以下错误:

Error: C stack usage is too close to the limit
Error: C stack usage is too close to the limit
terminate called after throwing an instance of 'Rcpp::binding_not_found'
  what():  binding not found: '.AutoloadEnv'
Aborted

这是产生错误的代码:

#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <RInside.h>

void *thread_main(void *args){

   RInside R(0,NULL);

   /* hope to execute an R script here */

   printf("--printing from thread--\n");

   return NULL;
}

int main(int argc, char *argv[]){

   pthread_t tid; 
   if( pthread_create(&tid, NULL, thread_main, NULL) ){
      printf("failed to create thread\n");
      return -1;
   } 

   sleep(1); 

   return 0;
}

我已尝试R_CStackLimit = (uintptr_t)-1按照编写 R 扩展中的建议进行设置,但无济于事。

我正在运行 ubuntu,R 版本 2.15.2,RInside 版本 0.2.10。

有可能做到这一点吗?还是我必须学习 Rserve 之类的东西?太感谢了!

4

1 回答 1

0

R 是并且很可能仍然是单线程的。RInside 花了一些时间来确保它是作为单例创建的;如果你颠覆你得到上面看到的错误。在同一个可执行文件中,您只能获得一个 RInside 实例,因此每个线程一个将不起作用。正如你所经历的。

请参阅我在源代码中包含的示例,了解在使用多线程前端(例如 Qt 或 Wt 库 for webapps)时如何处理单线程后端。

从长远来看,我们可能能够做 Rserve 所做的事情并进行分叉。欢迎代码贡献,我可能没有时间处理这个问题。

于 2013-02-11T22:00:16.553 回答