为什么在Rcpp中使用并行omp会导致分段故障?

为什么在Rcpp中使用并行omp会导致分段故障?,r,openmp,rcpp,R,Openmp,Rcpp,我想在%Table中创建一个更快的x==x1&y%版本,可能会与其他逻辑表达式混合使用。但是,当我运行以下命令时,我可以可靠地生成segfault #包括 #包括 使用名称空间Rcpp; bool do_is_in(int x,IntegerVector表,int tn){ 对于(int i=0;i

我想在%Table中创建一个更快的
x==x1&y%版本,可能会与其他逻辑表达式混合使用。但是,当我运行以下命令时,我可以可靠地生成segfault

#包括
#包括
使用名称空间Rcpp;
bool do_is_in(int x,IntegerVector表,int tn){
对于(int i=0;i

iR绝对不是100%多线程安全的。例如,您对do_的调用是按值接收IntegerVector类型的对象。这将调用一个复制构造函数,它(我假设)将从一个不是线程0的线程与R交互,因此会崩溃

一种方法是将所有内容简化为原始指针或非R数据类型,然后您就可以很好地使用OpenMP了。例如,您的函数签名变为
bool do\u is\u in(int x,int*Table,int tn)


在Rcpp中可能有一个合适的方法来实现这一点,但我从未尝试过这样做

例如,在体面的RcppParallel文档中已对此进行了解释:您不能(重新)使用R分配的内存,因为可能发生
gc()
事件。因此,在该包中使用了
RVector
RMatrix
。也许研究一下那里的例子?不正确。原始指针不买任何东西,只要它仍然指向来自R的相同内存块,这正是通过Rcpp及其“无拷贝”语义得到的。这里你需要实际的副本。