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()
是一个围绕plaintry/catch/throw
的包装器/扩展,它有助于格式化,但您需要对plainstd::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");
});
}