首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者/消费者使用Boost.Fibers

生产者/消费者使用Boost.Fibers
EN

Stack Overflow用户
提问于 2018-04-15 08:03:18
回答 1查看 1.1K关注 0票数 0

我正在尝试使用Boost.Fibers创建生产者/消费者。看来从这个channels中使用示例是正确的。由于我想要使用promise/future来表示完成,所以必须稍微修改这个示例。所以我写了一些幼稚的代码不做任何工作,只是信号完成。

代码语言:javascript
复制
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的方式。

使用

代码语言:javascript
复制
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:看上去这个频道不能使用移动灯

代码语言:javascript
复制
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时,在复制时会失败。

EN

回答 1

Stack Overflow用户

发布于 2019-10-08 04:55:19

我认为问题不在于未缓冲的通道不能传递可移动的项(其中一个push的过载需要T&),而是要求它们是默认的可构造的,这样它就可以用将推送项移动到的元素预填充队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49839752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档