zoukankan      html  css  js  c++  java
  • 线程安全的链表

    template<typename T>
    class ThreadsafeList
    {
        struct Node
        {
            std::mutex m;
            std::shared_ptr<T> data;
            std::unique_ptr<Node> next;
    
            Node():
                next(nullptr)
            {}
    
            Node(T const& value):
                data(std::make_shared<T>(value))
            {}
        };
    
        Node head;
    
    public:
        ThreadsafeList() = default;
        ThreadsafeList(const ThreadsafeList&) = delete;
        ThreadsafeList& operator=(const ThreadsafeList&) = delete;
        ~ThreadsafeList()
        {
            removeIf([](T const&){return true;});
        }
    
        void pushFront(T const& value)
        {
            auto newNode = std::make_unique<Node>(value);
            std::unique_lock<std::mutex> lock(head.m);
            newNode->next = std::move(head.next);
            head.next = std::move(newNode);
        }
    
        template<typename Function>
        void forEach(Function f)
        {
            Node* current = &head;
            std::unique_lock<std::mutex> lock(head.m);
            while(auto const next = current->next.get ()){
                std::unique_lock<std::mutex> nextLock(next->m);
                lock.unlock ();
                f(*next->data);
                current = next;
                lock = std::move(nextLock);
            }
        }
    
        template<typename Predicate>
        std::shared_ptr<T> findFirstIf(Predicate p)
        {
            Node* current = &head;
            std::unique_lock<std::mutex> lock(head.m);
            while(auto const next = current->next.get ()){
                std::unique_lock<std::mutex> nextLock(next->m);
                lock.unlock ();
                if (p(*next->data)){
                    return next->data;
                }
                current = next;
                lock = std::move(nextLock);
            }
            return std::shared_ptr<T>();
        }
    
        template<typename Predicate>
        void removeIf(Predicate p)
        {
            Node* current = &head;
            std::unique_lock<std::mutex> lock(head.m);
            while(auto const next = current->next.get ()){
                std::unique_lock<std::mutex> nextLock(next->m);
                if (p(*next->data)){
                    auto oldNext = std::move(current->next);
                    current->next = std::move(next->next);
                    nextLock.unlock ();
                }
                else{
                    lock.unlock ();
                    current = next;
                    lock = std::move(nextLock);
                }
            }
        }
    };
  • 相关阅读:
    H264 RTP封包原理(转载)
    FFmpeg的H264编码有内存泄漏吗??!!!
    最近在研究FFmpeg编解码
    罗一迦
    健康导报
    Vivado生成edf文件
    VIVADO生成MCS
    网络变压器
    Zynq 在Ubuntu上搭建编译环境
    [转]TimeQuest之delay_fall clock_fall傻傻分不清楚
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4845515.html
Copyright © 2011-2022 走看看