首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >boost::lockfree::函数队列?

boost::lockfree::函数队列?
EN

Stack Overflow用户
提问于 2017-06-11 18:09:20
回答 2查看 829关注 0票数 3

我想构建一个简单的函数boost::lockfree::queue,它不带参数,也不返回值。

似乎boost::lockfree::queue要求项目类型是可分配的和可销毁的,不幸的是,boost::function<void ()>没有满足这些要求。

本着https://stackoverflow.com/a/21406186/393756的精神,我现在正试图通过简单函数指针的boost::lockfree::queue来实现这一点:

代码语言:javascript
复制
boost::lockfree::queue<void (*)()> queue;

是否可以将 boost::function<void ()> 推送到此队列中?如果可以,如何推送?

EN

回答 2

Stack Overflow用户

发布于 2017-06-11 18:20:16

不能,但您可以使用动态内存分配+类型擦除来实现此目的:

代码语言:javascript
复制
struct callback_back{

   virtual void execute() = 0;
   ~callback_base() = default;

};

template<class F>
class callback{

  private:
     F m_function;

  public:
    callback(F&& function) : m_function(std::forward<F>(function)){}

    virtual void execute() {
        m_function();
    }

}

template<class F>
std::unique_ptr<callback_base> make_callback(F&& f){
    return std::unique_ptr<callback_base>(
       new callback<F>(std::forward<F>(f));
    );
}

使用callback_base作为非例外可移动类型(也称为boost::lockfree::queue<std::unique_ptr<callback_base>>)。

票数 1
EN

Stack Overflow用户

发布于 2019-05-13 01:27:43

到目前为止,我找到的唯一方法是创建一个函数对象的原始指针

代码语言:javascript
复制
boost::lockfree::queue<std::function<void(void)> *> tasks_; // the queue
// let f = stack allocated std::function<T(T)> instance
tasks_.push(new std::function<void(void)>(f));
// pop
std::function<void(void)> * f;
tasks_.pop(f);
// execute in try/catch make sure to delete in case of exception?
(*f)();
// you should delete f here if you are done with it

// in the destructor of the class that owns tasks_ you should delete the remaining std::function instances

这里的挑战是在考虑到异常安全的情况下何时删除此实例

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

https://stackoverflow.com/questions/44482613

复制
相关文章

相似问题

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