第十五课:C++多线程细粒度锁队列

#include<thread>
#include<iostream>

using namespace std;
using namespace this_thread;

template<class T>

class threadsafe_queue
{
private:
    struct node
    {
        shared_ptr<T> date;  //智能指针
        unique_ptr<node> next;
    };

    //FIFO

    mutex head_mutex;
    unique_ptr<node> head;  //整个队列的容量(链表)
    mutex tail_mutex;
    node* tail;
    node* get_tail()
    {
        lock_guard<mutex>tail_lock(tail_mutex);
        return tail;
    }

    unique_ptr<node> pop_head()
    {
        lock_guard<mutex> head_lock(head_mutex);

        if (head.get() == get_tail())
        {
            return nullptr;
        }
        unique_ptr<node> old_head = move(head);
        head = move(old_head->next);
        return old_head;
    }

public:
    threadsafe_queue() :head(new node), tail(head.get()) {}
    threadsafe_queue(const threadsafe_queue& other) = delete;
    threadsafe_queue& operator = (const threadsafe_queue& other) = delete;

    //入队
    void push(T new_value)
    {
        shared_ptr<T> new_date(make_shared<T> (move(new_value)));
        unique_ptr<node> p(new node);

        node* const new_tail = p.get();
        lock_guard<mutex> tail_lock(tail_mutex);
        tail->date = new_date;
        tail->next = move(p);
        tail = new_tail;
    }

    //出队
    shared_ptr<T>try_pop()
    {
        unique_ptr<node> old_head = pop_head();
        return old_head ? old_head->date : shared_ptr<T>();
    }
};

void insertDate(threadsafe_queue<int>& test, int date)
{
    test.push(date);
}

void deleteDate(threadsafe_queue<int>& test)
{
    shared_ptr<int> result = test.try_pop();

    if (result == nullptr)
    {
        printf("没有数据\n");
    }
    else
    {
        printf("%d\n", *result);
    }
}


int main()
{

    vector<thread> t;

    threadsafe_queue<int> test;

    for (int i = 0; i < 5; i++)
    {
        t.push_back(thread(insertDate, ref(test), i));
        t.push_back(thread(deleteDate, ref(test)));
    }

    for (auto& v : t)
    {
        v.join();
    }
    return 0;
}/*
C++多线程细粒度锁队列

*/

template<class T>

class threadsafe_queue
{
private:
    struct node
    {
        shared_ptr<T> date;  //智能指针
        unique_ptr<node> next;
    };

    //FIFO

    mutex head_mutex;
    unique_ptr<node> head;  //整个队列的容量(链表)
    mutex tail_mutex;
    node* tail;
    node* get_tail()
    {
        lock_guard<mutex>tail_lock(tail_mutex);
        return tail;
    }

    unique_ptr<node> pop_head()
    {
        lock_guard<mutex> head_lock(head_mutex);

        if (head.get() == get_tail())
        {
            return nullptr;
        }
        unique_ptr<node> old_head = move(head);
        head = move(old_head->next);
        return old_head;
    }

public:
    threadsafe_queue() :head(new node), tail(head.get()) {}
    threadsafe_queue(const threadsafe_queue& other) = delete;
    threadsafe_queue& operator = (const threadsafe_queue& other) = delete;

    //入队
    void push(T new_value)
    {
        shared_ptr<T> new_date(make_shared<T> (move(new_value)));
        unique_ptr<node> p(new node);

        node* const new_tail = p.get();
        lock_guard<mutex> tail_lock(tail_mutex);
        tail->date = new_date;
        tail->next = move(p);
        tail = new_tail;
    }

    //出队
    shared_ptr<T>try_pop()
    {
        unique_ptr<node> old_head = pop_head();
        return old_head ? old_head->date : shared_ptr<T>();
    }
};

void insertDate(threadsafe_queue<int>& test, int date)
{
    test.push(date);
}

void deleteDate(threadsafe_queue<int>& test)
{
    shared_ptr<int> result = test.try_pop();

    if (result == nullptr)
    {
        printf("没有数据\n");
    }
    else
    {
        printf("%d\n", *result);
    }
    


}


int main()
{

    vector<thread> t;

    threadsafe_queue<int> test;

    for (int i = 0; i < 5; i++)
    {
        t.push_back(thread(insertDate, ref(test), i));
        t.push_back(thread(deleteDate, ref(test)));
    }

    for (auto& v : t)
    {
        v.join();
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值