Provides R-friendly threading functionality:
checkUserInterrupt()
, Rcout
, and
Rcerr
,std::thread
,The library is header-only, platform-independent, and only requires a C++11-compatible compiler.
For a detailed description of its functionality and examples, see the associated JSS paper or the API documentation.
Since then, the following new features have been added:
Printing to the error stream with Rcerr
.
Free-standing functions like parallelFor()
now
dispatch to a global thread pool that persists for the entire session.
This significantly speeds up programs that repeatedly call these
functions.
Faster runtimes due to lock-free work stealing queue and loops (from quickpool).
Option to resize a thread pool.
An R function RcppThread::detectCores()
to determine
the number of (logical) cores on your machine.
C++ classes ProgressCounter
and
ProgressBar
for tracking progress in long-running
loops.
Example usage:
// 20 iterations in loop, update progress every 1 sec
::ProgressBar bar(20, 1);
RcppThread::parallelFor(0, 20, [&] (int i) {
RcppThreadstd::this_thread::sleep_for(std::chrono::milliseconds(200));
++;
bar});
Output: (just one line that is continuously updated)
...
Computing: [========================== ] 65% (~1s remaining)
...
Computing: [========================================] 100% (done)
Release version from CRAN:
install.packages("RcppThread")
Latest development version from github:
# install.packages("devtools")
::install_github("tnagler/RcppThread") devtools
Pass "RcppThread"
to the depends
argument
and "cpp11"
to the plugins
argument. For
example:
::cppFunction('void func() { /* actual code here */ }',
Rcppdepends = "RcppThread", plugins = "cpp11")
Add
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppThread)]]
before including any headers in your source code.
CXX_STD = CXX11
to the
src/Makevars(.win)
files of your package.RcppThread
to the LinkingTo
field of
your DESCRIPTION
file.For optimal portability, you might also want to add
PKG_LIBS = `"$(R_HOME)/bin/Rscript" -e "RcppThread::LdFlags()"`
to your src/Makevars
(not .win
). This adds
-latomic
/-lpthread
flags as necessary and
available.
std::cout
, std::cerr
, and
std::thread
There are preprocessor options to replace all occurrences of
std::cout
, std::cerr
, and
std::thread
with calls to RcppThread::Rcout
,
RcppThread::Rcerr
, and RcppThread::Thread
(provided that the RcppThread headers are included first). To enable
this, use
#define RCPPTHREAD_OVERRIDE_COUT 1 // std::cout override
#define RCPPTHREAD_OVERRIDE_CERR 1 // std::cerr override
#define RCPPTHREAD_OVERRIDE_THREAD 1 // std::thread override
before including the RcppThread headers.
Nagler, T. (2021). “R-Friendly Multi-Threading in C++.” Journal of Statistical Software, Code Snippets, 97(1), 1-18. doi: 10.18637/jss.v097.c01