0

我正在尝试从多个线程中进行 RInside 调用,并遇到此错误。

terminate called after throwing an instance of 'std::runtime_error'
what():  Error evaluating: qnorm(.65, mean=0,sd=1)

导致这种情况的代码行是:

//within main.cpp//
std::shared_ptr<RInside> R = std::make_shared<RInside>();

//within some_class::some_function(std::shared_ptr<RInside> R)//
double value = Rcpp::as<double>(R->parseEval("qnorm(.65, mean=0,sd=1)"));

R 是一个 std::shared_ptr 在 80+线程之间共享。
我假设这个问题是一个锁定问题,因为 RInside 实例正忙于执行第一个 parseEval 时另一个进来。

我的假设是对的吗?谢谢!

4

1 回答 1

0

为 RInside 实例提出了一个轻量级的包装器。让多个线程安全地使用实例。将使用的返回类型和模板化参数更改为 Rcpp::as<>,并使用 shared_ptr 传递 RInside_Container。

class RInside_Container{
    double use(string command_to_execute){
        mtx.lock();
        double value = Rcpp::as<double>(R.parseEval(command_to_execute));
        mtx.unlock();
        return value;
    }
    Rinside R{};
    std::mutex mtx;
};

谢谢德克

于 2015-02-12T05:10:44.177 回答