Multithreading 使用Rcpp时抛出错误的线程安全方式是什么

Multithreading 使用Rcpp时抛出错误的线程安全方式是什么,multithreading,rcpp,Multithreading,Rcpp,我在Rcpp函数中使用RcppThread实现并行性。在并行循环中间抛出错误的首选方法是什么?R的API是单线程的,所以我假设Rcpp::stop()不是线程安全的RcppThread提供了线程安全的cout和CheckUserInterrupt方法,但据我所知,它不是线程安全的stop 我正在尝试做的一个例子: #include <RcppThread.h> // [[Rcpp::plugins(cpp11)]] // [[Rcpp::depends(RcppThread)]]

我在
Rcpp
函数中使用
RcppThread
实现并行性。在并行循环中间抛出错误的首选方法是什么?R的API是单线程的,所以我假设
Rcpp::stop()
不是线程安全的
RcppThread
提供了线程安全的
cout
CheckUserInterrupt
方法,但据我所知,它不是线程安全的
stop

我正在尝试做的一个例子:

#include <RcppThread.h>
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppThread)]]

void myfun() {

  // parallel loop
  RcppThread::parallelFor(0, 100, [](int j){
    // do something that causes an error
    Rcpp::stop("Is this error unsafe?");
  });

}
#包括
//[[Rcpp::插件(cpp11)]]
//[[Rcpp::Dependes(RcppThread)]]
void myfun(){
//并联回路
RcppThread::parallelFor(01100,[](intj){
//做一些导致错误的事情
Rcpp::stop(“此错误不安全吗?”);
});
}
可能不是——RcppParallel文档中所述的简单且经常重复的规则是,不应将多线程代码返回到R,或与R创建/拥有的内存进行任何联系

从我的头顶上,我会

  • 打破平行循环
  • 将错误条件或文本指定给字符串
  • 回到单线程代码调用
    Rcpp::stop(thattext)

托马斯·纳格勒的回答来自:

可以使用本机C++ ++代码>抛出STD::RunTimeEyror()/Cuth>,并且缓存到线程与主池同步。然后错误被推送到主线程,在那里它作为标准运行时错误由

Rcpp
处理,并被推送到R

因此:

#包括
//[[Rcpp::插件(cpp11)]]
//[[Rcpp::Dependes(RcppThread)]]
void myfun(){
//并联回路
RcppThread::parallelFor(01100,[](intj){
//做一些导致错误的事情
抛出std::runtime_错误(“你做了一件坏事”);
});
}

我担心可能是这样。我想我会跟RcppThread的制造商跟进一个功能请求。:)谢谢,德克!是的,这与我写的内容有关:在平行部分中,你可以使用普通的C++习语和变量,而不是R。而
Rcpp::stop()
是一个围绕plain
try/catch/throw
的包装器/扩展,它有助于格式化,但您需要对plain
std::throw
进行未处理。
#include <RcppThread.h>
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppThread)]]

void myfun() {

  // parallel loop
  RcppThread::parallelFor(0, 100, [](int j){
    // do something that causes an error
    throw std::runtime_error("You did a bad thing");
  });

}