Pointeur de fonction Threadsafe avec Rcpp et RcppParallel via std :: shared_ptr

Je voudrais utiliser un pointeur de fonction threadsafe à appliquer dans un travailleur RcppPrallel. Mais j’ai déjà des problèmes avec ce petit exemple. Peu importe si je l’utilise dans un package et que j’ajoute SystemRequirements: C++11 dans le fichier DESCRIPTION, ou que je l’utilise dans un fichier cpp standard et que j’ajoute // [[Rcpp::plugins(cpp11)]] le même // [[Rcpp::plugins(cpp11)]] erreur : ‘shared_ptr’ n’est pas un membre de ‘std’ . Est-ce que quelqu’un peut m’aider s’il vous plait? Je vous remercie!

 #include  using namespace Rcpp; using namespace std; double f1 (double x, double y) { return x * y; } double f2 (double x, double y) { std::shared_ptr p1; std::cout << "p1: " << p1.use_count() << '\n'; return x + y; } typedef double (*funcPtr)(double x, double y); std::shared_ptr selectf(std::ssortingng abc) { std::shared_ptr fp = NULL; if(abc == "a"){ fp = std::make_shared(new funcPtr(&f1)); }else { fp = std::make_shared(new funcPtr(&f2)); } return fp; } // [[Rcpp::export]] double f0(double x, double y, std::ssortingng abc){ double ret; df = selectf(abc); ret = df(x, y); return(ret); } /*** R if(FALSE){ f0(10, 10, "a") } */ 

Informations système:

 > sessionInfo() R version 3.5.0 (2018-04-23) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 7 x64 (build 7601) Service Pack 1 Masortingx products: default locale: [1] LC_COLLATE=German_Germany.1252 [2] LC_CTYPE=German_Germany.1252 [3] LC_MONETARY=German_Germany.1252 [4] LC_NUMERIC=C [5] LC_TIME=German_Germany.1252 attached base packages: [1] stats graphics grDevices utils datasets [6] methods base loaded via a namespace (and not attached): [1] comstackr_3.5.0 R6_2.2.2 magrittr_1.5 [4] tools_3.5.0 withr_2.1.2 roxygen2_6.0.1 [7] yaml_2.1.19 memoise_1.1.0 Rcpp_0.12.18 [10] xml2_1.2.0 ssortingngi_1.2.2 ssortingngr_1.3.1 [13] digest_0.6.15 commonmark_1.5 devtools_1.13.5 

std::shared_ptr est déclaré dans l’en-tête . Essayer:

 #include  

Vous pouvez trouver la documentation pour cela ici .

La réponse précédente vous avait déjà parlé de #include ; dans le suivi, vous affirmez que l’exemple de base ne fonctionne pas – il le fait pour moi.

Mais une première précision: toute la gestion de la mémoire dans les appels aux fonctions ajoutées (compilées) doit se faire via la gestion de la mémoire de R. C’est ce que fait Rcpp et ce que Rcpp documente. Maintenant, pour le code multithread, nous avons RMasortingx et RVector dans RcppParalllel car nous ne pouvons pas interférer avec la gestion de la mémoire de R (et son mode mono-threadé) à partir de code multithread; voir l’excellente documentation de RcppParallel pour plus de détails.

Cela dit, si vous êtes sûr de vouloir shared_ptr dans une étendue définie, vous pouvez le faire. Voici une copie de travail basée sur l’exemple que vous avez lié également.

Code

 #include  #include  // [[Rcpp::plugins(cpp11)]] struct C { int* data; }; // [[Rcpp::export]] bool foo() { std::shared_ptr p1; std::shared_ptr p2 (nullptr); std::shared_ptr p3 (new int); std::shared_ptr p4 (new int, std::default_delete()); std::shared_ptr p5 (new int, [](int* p){delete p;}, std::allocator()); std::shared_ptr p6 (p5); std::shared_ptr p7 (std::move(p6)); std::shared_ptr p8 (std::unique_ptr(new int)); std::shared_ptr obj (new C); std::shared_ptr p9 (obj, obj->data); Rcpp::Rcout << "use_count:\n"; Rcpp::Rcout << "p1: " << p1.use_count() << '\n'; Rcpp::Rcout << "p2: " << p2.use_count() << '\n'; Rcpp::Rcout << "p3: " << p3.use_count() << '\n'; Rcpp::Rcout << "p4: " << p4.use_count() << '\n'; Rcpp::Rcout << "p5: " << p5.use_count() << '\n'; Rcpp::Rcout << "p6: " << p6.use_count() << '\n'; Rcpp::Rcout << "p7: " << p7.use_count() << '\n'; Rcpp::Rcout << "p8: " << p8.use_count() << '\n'; Rcpp::Rcout << "p9: " << p9.use_count() << '\n'; return true; } 

Utilisation

 R> Rcpp::sourceCpp("/tmp/soExample.cpp") R> foo() use_count: p1: 0 p2: 0 p3: 1 p4: 1 p5: 2 p6: 0 p7: 2 p8: 1 p9: 2 [1] TRUE R>