J’essaie de créer un producteur / consommateur à l’aide de Boost.Fibers. On dirait que l’utilisation de channels
de cet exemple est la bonne chose à faire. L’exemple doit être légèrement modifié car je souhaite signaler l’achèvement à l’aide de promise/future
. Alors j’ai écrit un code naïf pour ne pas faire de travail, juste signaler la fin.
struct fiber_worker { fiber_worker() { wthread = std::thread([self{this}]() { for (int i = 0; i ch.pop(tsk)) { tsk(); } }}.detach(); } task tsk; while (boost::fibers::channel_op_status::closed != self->ch.pop(tsk)) { tsk(); } }); } boost::fibers::future submit() noexcept { boost::fibers::promise prom; auto retVal = prom.get_future(); ch.push([p{std::move(prom)}]() mutable { p.set_value(); }); return retVal; } ~fiber_worker() { ch.close(); wthread.join(); } using task = std::function; std::thread wthread; boost::fibers::buffered_channel ch{1024}; };
Cependant, il ne comstackrait pas, il se plaindrait du fait que le constructeur de la copie supprimée de la promise
était accessible. Tout d’abord, je ne comprends pas où (et pourquoi) le constructeur de copie est appelé. Deuxièmement, je ne suis pas sûr que ce soit la manière dont les boost::fibers
devraient être utilisées.
L’usage
int main() { fiber_worker bwk; bwk.submit().get(); }
Le message d’erreur
Dans le fichier inclus à partir de / usr / include / c ++ / 7 / future: 48: 0, à partir de /home/user/Downloads/boost_1_66_0/boost/fiber/exceptions.hpp:12, à partir de / home / utilisateur / Téléchargements / boost_1_66_0 / boost /fiber/future/future.hpp:17, from /home/user/Development/Tests/shared_state_test/main.cpp:4: /usr/include/c++/7/bits/std_function.h: En instantiation de ‘void statique std :: _ Function_base :: _ Base_manager :: _ M_clone (std :: _ Any_data &, const std :: _ Any_data &, std :: false_type) [avec _Functor = fibre_worker :: submit () ::; std :: false_type = std :: intégral_constant] ‘: /usr/include/c++/7/bits/std_function.h:227:16: requirejs de’ statique bool std :: _ Function_base :: _ Base_manager :: _ M_manager ( std :: _ Any_data &, const std :: _ Any_data &, std :: _ Manager_operation) [avec _Functor = fibre_worker :: submit () :: ” /usr/include/c++/7/bits/std_function.h:695:19: requirejs from ‘std :: function :: function (_Functor) [avec _Functor = fibre_worker :: submit () ::; = vide; = vide; _Res = void; _ArgTypes = {}] ‘/home/user/Development/Tests/shared_state_test/main.cpp:45:66:
requirejs à partir d’ici /usr/include/c++/7/bits/std_function.h:192:6: erreur: utilisation de la fonction supprimée ‘fibre_worker :: submit () ::: 🙁 const fibre_worker :: submit () :: & ) ‘new _Functor ( __source._M_access <_Functor > ()); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ / home / utilisateur /Development/Tests/shared_state_test/main.cpp:45:36: note: ‘fibre_worker :: submit () ::: 🙁 const fibre_worker :: submit () :: &)’ est implicitement supprimé car la définition par défaut serait mal formé: ch.push (p {std :: move (prom)} mutable {p.set_value ();}); ^ /home/user/Development/Tests/shared_state_test/main.cpp:45:36: erreur: utilisation de la fonction supprimée ‘boost :: fibres :: promise :: promise (const boost :: fibres :: promise &)’ dans le fichier inclus à partir de /home/user/Development/Tests/shared_state_test/main.cpp:5:0: /home/user/Downloads/boost_1_66_0/boost/fiber/future/promise.hpp:192:5: note: déclaré ici promis ( prom prom &) = supprimer; ^ ~~~~~~
- en utilisant un gestionnaire de complétion boost lambda avec le delay_timer
- Problème lors de l’exécution de boost eample blocking_udp_echo_client sur MacOSX
- C ++ Boost fichier non trouvé
- Boost-Extension-Reflection Comment corriger l’erreur de segmentation lors de la compilation d’un échantillon officiel non avec bjam?
- boost :: function & boost :: lambda à nouveau
EDIT001: On dirait que la chaîne n’est pas capable d’utiliser des lambdas en mouvement
struct test { test() = default; test(const test &rhs) = delete; test &operator=(const test &rhs)= delete; test(test &&rhs) = default; test &operator=(test &&rhs)= default; size_t _1 = 0; size_t _2 = 0; size_t _3 = 0; size_t _4 = 0; void print() const { std::cout << _1 << _2 << _3 << 4 << std::endl; } }; int main() { using task = std::function; boost::fibers::buffered_channel ch{1024}; test tst; ch.push([t{std::move(tst)}]() { t.print(); }); }
Je contacterai boost :: mainteneur de fibres pour clarification
EDIT002: Il n’y a aucun problème avec boost::fibers::buffered_channel
le seul problème ici avec mon Alzheimer, j’ai (encore une fois) oublié que std::function
doit être copiable, et lorsque le lambda ne capture que le type mobile std::function
création sera échec sur copie