在线程内创建一个RInside实例

时间:2013-02-11 18:41:09

标签: c++ r pthreads rinside

我有兴趣编写一个能够运行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扩展中的建议设置R_CStackLimit = (uintptr_t)-1,但无济于事。

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

有可能做到这一点吗?还是我必须学习像Rserve这样的东西? 非常感谢你!

1 个答案:

答案 0 :(得分:0)

R是,并且可能仍然是单线程的。 RInside达到一定的长度以确保它被创建为单身人士;如果你颠覆你得到上面你看到的错误。在同一个可执行文件中,您只能获得一个RInside实例,因此每个线程一个不起作用。正如你所经历的那样。

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

从长远来看,我们可以做Rserve所做的事情和分叉。代码贡献将是受欢迎的,我可能没有时间来处理这个问题。