多线程使用一个RInside实例

时间:2015-02-12 00:52:31

标签: c++ multithreading rinside

我正在尝试从多个线程中进行一次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。

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

1 个答案:

答案 0 :(得分:0)

为RInside实例提供了一个轻量级的包装器。允许多个线程安全地使用该实例。将使用的返回类型和模板化参数更改为Rcpp :: as&lt;&gt;,并使用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;
};

谢谢Dirk