如何从cpp代码中调用R函数作为工作线程?使用Rcpp包

时间:2014-09-08 00:16:25

标签: r multithreading rcpp

我在使用Rcpp时发现了一个奇怪的问题,也许这是Rcpp包中已知的限制,但我没有通过搜索相关文档找到任何提示,希望有人可以帮助或解释这个问题。

这是我的代码:

// [[Rcpp::export]]
void set_r_cb(Function f) {
  Environment env = Environment::global_env();
  env["place_f"] = f;
}
void __test_thread(void* data) {
  Rprintf("in thread body\n");
  Function f("place_f");
  f(*((NumericVector*)data));
}

// [[Rcpp::export]]
NumericVector use_r_callback(NumericVector x) {
  Environment env = Environment::global_env();
  Function f = env["place_f"];
{  // test thread 
  tthread::thread t(__test_thread, x);
  t.join();
}  
  return f(x);
}

在R代码中的位置:

> x = runif(100)
> set_r_cb(fivenum)

没有线程调用时,一切正常。 返回这样的东西:

> use_r_callback(x)
[1] 0.01825808 0.24010829 0.37492796 0.58618216 0.93935818

使用线程代码时,我收到了这样的错误:

> use_r_callback(x)
in thread body
Error: C stack usage  237426928 is too close to the limit

BTW,我使用tinythread,https://gitorious.org/tinythread,但是当使用boost :: thread时会发生同样的错误。

1 个答案:

答案 0 :(得分:6)

R本身是单线程的,因此您只需 从多个线程中使用您的R实例。

你可以从R调用C ++

  • 设置(如果需要)
  • 设置互斥锁
  • 多线程的内容,从不调用R,从不接触R数据结构(在这里你可以使用Open MP,Boost线程,C ++线程,标准pthreads,......)
  • 收集结果
  • 清除互斥锁
  • 准备退货(如果需要)

并返回。几乎所有其他东西都会给你带来错误。