美文网首页
一个相对完整的线程安全queue版本

一个相对完整的线程安全queue版本

作者: KingOfLion | 来源:发表于2019-06-01 23:22 被阅读0次

    class threadsafe_queue
    {
    public:
    threadsafe_queue():head(new node),tail(head.get()){}
    threadsafe_queue(const threadsafe_queue& other)=delete;
    threadsafe_queue& operator=(const threadsafe_queue& other)=delete;
    std::shared_ptr<t> try_pop()
    {
    std::unique_ptr<node> const old_head=try_pop_head();
    return old_head?old_head->data:std::shared_ptr<t>();
    }
    bool try_pop(T& value)
    {
    std::unique_ptr<node> const old_head=try_pop_head(value);
    return old_head;
    }
    std::shared_ptr<t> wait_and_pop()
    {
    std::unique_ptr<node> const old_head=wait_pop_head();
    return old_head->data;
    }
    void wait_and_pop(T& value)
    {
    std::unique_ptr<node> const old_head=wait_pop_head(value);
    }
    void empty()
    {
    std::lock_guard<std::mutex> head_lock(head_mutex);
    return (head==get_tail());
    }
    void push(T new_value)
    {
    std::shared_ptr<t> new_data(std::make_shared<t>(std::move(new_value)));
    std::unique_ptr<node> p(new node);
    {
    std::lock_guard<std::mutex> tail_lock(tail_mutex);
    tail->data=new_data;
    node* const new_tail=p.get();
    tail->next=std::move(p);
    tail=new_tail;
    }
    data_cond.notify_one();
    }

    private:
    node* get_tail()
    {
    std::lock_guard<std::mutex> tail_lock(tail_mutex);
    return tail;
    }
    std::unique_ptr<node> pop_head()
    {
    std::unique_ptr<node> const old_head=std::move(head);
    head=std::move(old_head->next);
    return old_head;
    }
    std::unique_lock<std::mutex> wait_for_data()
    {
    std::unique_lock<std::mutex> head_lock(head_mutex);
    data_cond.wait(head_lock,[&]{return head!=get_tail();});
    return std::move(head_lock);
    }
    std::unique_ptr<node> wait_pop_head()
    {
    std::unique_lock<std::mutex> head_lock(wait_for_data());
    return pop_head();
    }
    std::unique_ptr<node> wait_pop_head(T& value)
    {
    std::unique_lock<std::mutex> head_lock(wait_for_data());
    value=std::move(head->data);
    return pop_head();
    }
    std::unique_ptr<node> try_pop_head()
    {
    std::lock_guard<std::mutex> head_lock(head_mutex);
    if(head.get()==get_tail())
    {
    return std::unique_ptr<node>();
    }
    return pop_head();
    }
    std::unique_ptr<node> try_pop_head(T& value)
    {
    std::lock_guard<std::mutex> head_lock(head_mutex);
    if(head.get()==get_tail())
    {
    return std::unique_ptr<node>();
    }
    value=std::move(
    head->data);
    return pop_head();
    }

    private:
    struct node
    {
    std::shared_ptr<t> data;
    std::unique_ptr<node> next;
    };

    std::mutex head_mutex;
    std::unique_ptr<node> head;
    std::mutex tail_mutex;
    node* tail;
    std::condition_variable data_cond;
    

    };

    相关文章

      网友评论

          本文标题:一个相对完整的线程安全queue版本

          本文链接:https://www.haomeiwen.com/subject/civztctx.html