我相信问题不在于无缓冲通道不能传递可移动项(push的重载之一是T &&),而是要求它们是默认可构造的,以便它可以使用元素以将推送的项目移入。
我正在尝试使用Boost.Fibers创建生产者/消费者。似乎从channels
中使用example是正确的事情。由于我想使用promise/future
表示信号完成,因此示例必须稍作更改。所以我写了一些幼稚的代码,不做任何工作,只是示意完成。
struct fiber_worker { fiber_worker() { wthread = std::thread([self{this}]() { for (int i = 0; i < 4; ++i) { boost::fibers::fiber{ [self]() { task tsk; while (boost::fibers::channel_op_status::closed != self->ch.pop(tsk)) { tsk(); } }}.detach(); } task tsk; while (boost::fibers::channel_op_status::closed != self->ch.pop(tsk)) { tsk(); } }); } boost::fibers::future<void> submit() noexcept { boost::fibers::promise<void> 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<void()>; std::thread wthread; boost::fibers::buffered_channel<task> ch{1024}; };
但是,它将无法编译,它将抱怨正在访问
promise
删除的副本构造函数。首先,我不知道在哪里(以及为什么)要调用复制构造函数。其次,我不确定这是应使用boost::fibers
的方式。用法
int main() { fiber_worker bwk; bwk.submit().get(); }
错误消息
在/ usr / include / c ++ / 7 / future:48:0中包含的文件中,从/home/user/Downloads/boost_1_66_0/boost/fiber/exceptions.hpp:12,从/home/user/Downloads/boost_1_66_0/boost/fiber/future/future.hpp:17,从/home/user/Development/Tests/shared_state_test/main.cpp:4:/usr/include/c++/7/bits/std_function.h:实例化为“静态”虚空std :: _ Function_base :: _ Base_manager <_functor> :: _ M_clone(std :: __ Any_data&,const std :: _ Any_data&,std :: false_type)[with _Functor =fiber_worker :: submit()::; std :: false_type =std :: integral_constant]”:/usr/include/c++/7/bits/std_function.h:227:16:“静态”必填布尔std :: _ Function_base :: _ Base_manager <_functor> :: _ M_manager(std :: _ Any_data&,const std :: __ Any_data&,std :: __ Manager_operation)[with _Functor =fibre_worker :: submit()::]’/usr/include/c++/7/bits/std_function.h:695:19:需要‘std :: function <_res ...> :: function(_Functor)[和_Functor= fiber_worker :: submit()::; =无效; =无效; _Res = void; _ArgTypes = {}]’/home/user/Development/Tests/shared_state_test/main.cpp:45:66:从此处需要/usr/include/c++/7/bits/std_function.h:192:6:错误:使用已删除的功能‘fiber_worker :: submit()::: :( constfibre_worker :: submit()::&)’新的_Functor(______._ M_access <_functor>>());^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ / home / user /Development/Tests/shared_state_test/main.cpp:45:36:注意:‘fiber_worker :: submit()::: :( constfibre_worker :: submit()::&)’被隐式删除,因为默认定义格式不正确:ch.push(p {std :: move(prom)}可变{p.set_value();});^ /home/user/Development/Tests/shared_state_test/main.cpp:45:36:错误:使用删除的功能'boost :: fibers :: promise :: promise(constboost :: fibers :: promise&)’在文件中包含/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:注意:在这里声明promise(promise const&)=删除;^ ~~~~~~]]
EDIT001:频道似乎无法使用移动lambda。
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<void()>; boost::fibers::buffered_channel<task> ch{1024}; test tst; ch.push([t{std::move(tst)}]() { t.print(); }); }
将与boost :: fiber维护者联系以进行澄清
EDIT002:boost::fibers::buffered_channel
没问题,我的阿尔茨海默病唯一的问题是,我(再次)忘记了std::function
必须是可复制的,并且当lambda仅捕获可移动类型时std::function
创建将在复制时失败
我正在尝试使用Boost.Fibers创建生产者/消费者。看起来使用此示例中的通道是正确的事情。因为我想发信号,所以示例必须稍作更改...
我相信问题不在于无缓冲通道不能传递可移动项(push的重载之一是T &&),而是要求它们是默认可构造的,以便它可以使用元素以将推送的项目移入。
我相信问题不在于无缓冲通道不能传递可移动项(push的重载之一是T &&),而是要求它们是默认可构造的,以便它可以使用元素以将推送的项目移入。