我正在尝试使用Boost.Fibers创建生产者/消费者。看来从这个channels中使用示例是正确的。由于我想要使用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/未来的文件中: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/bit/std_function.h.h:在用_Functor =fiber_worker::submit():fiber_worker::submit()实例化‘static std::_Function_base::_Base_manager<_Functor>::_M_clone(std::_Any_data&,const std::_Any_data&,std::false_type’;/usr/include/c++/7/bits/std_function.h:227:16:= std::false_type =std::std::_Function_base::_Base_manager<_Functor>::_M_manager(std::_Any_data&,const std::_Any_data&所需的std::false_type/usr/include/c++/7/bits/std_function.h:695:19:( std::_Manager_operation) with _Functor =fiber_worker::submit()::‘std::function<_Res(_ArgTypes.>)::function( _Functor ),_Functor= fiber_worker::submit()::;= void;= _Res = void;_ArgTypes ={}‘_ArgTypes 需要从这里/usr/include/c++/7/bit/std__Functor.h:192:6: error:使用已删除的函数‘fiber_worker::submit():(const fiber_worker::submit():&)’新_Functor(__source._M_access<_Functor>();^~ /home/user/Development/Tests/shared_state_test/main.cpp:45:36:注:‘fiber_worker::submit():(const fiber_worker::submit()::&)’“被隐式删除,因为默认定义将不正确: ch.push(p{std::move(prom)} mutable { p.set_value();});^ /home/user/Development/Tests/shared_state_test/main.cpp:45:36:错误: /home/user/Development/Tests/shared_state_test/main.cpp:5:0: /home/user//home/user/Development/Tests/shared_state_test/main.cpp:5:0:/home/user/boost_1_66_0/boost_1_66_0/boost所包含的文件中使用已删除的函数‘boost::fibers::promise’/纤维/未来/承诺. here :192:5:注:声明在此承诺(诺言,const&) =删除;^~~
EDIT001:看上去这个频道不能使用移动灯
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(); });
}将接触促进::纤维保持器澄清
EDIT002:boost::fibers::buffered_channel没有问题--这里唯一的问题是我的老年痴呆症,我(再次)忘记了std::function必须是可复制的,而且当lambda只捕获可移动类型的std::function时,在复制时会失败。
发布于 2019-10-08 04:55:19
我认为问题不在于未缓冲的通道不能传递可移动的项(其中一个push的过载需要T&),而是要求它们是默认的可构造的,这样它就可以用将推送项移动到的元素预填充队列。
https://stackoverflow.com/questions/49839752
复制相似问题