• 线程安全的链表


    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);
                }
            }
        }
    };
  • 相关阅读:
    Introduction to debugging neural networks
    Faster R-CNN教程
    最长递增子序列
    321. Create Maximum Number 解题方法详解
    Ubuntu安装opencv with cuda
    转载:LeetCode:5Longest Palindromic Substring 最长回文子串
    64. Minimum Path Sum
    322. Coin Change
    148. Sort List
    微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4845515.html
Copyright © 2020-2023  润新知