我在使用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时会发生同样的错误。
答案 0 :(得分:6)
R本身是单线程的,因此您只需 从多个线程中使用您的R实例。
你可以从R调用C ++
并返回。几乎所有其他东西都会给你带来错误。