پیاده سازی concurrent container - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

پیاده سازی concurrent container

0 امتیاز
سلام.آیا میشه کانتینری طراحی کرد که هر کلاکشنی را نگهداری کنی و به  صورت concurrent از اون استفاده کنیم.
سوال شده شهریور 8, 1399  بوسیله ی .bahman (امتیاز 137)   3 18 24

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

کانتینر به صورت جنریک دریافت میشه و شما عملیات پایه ای را با lock کانکارنت می کنید یک نمونه ساده به صورت زیر:

#include <mutex>

template <class C>
class ConcurrentContainer {
public:
    C container_;
    mutable std::mutex mutex_;

    bool lockedEmpty() const noexcept;
    typename C::size_type lockedSize() const noexcept;
    void lockedPush_back(const typename C::value_type& value);
    bool lockedTry_pop(typename C::value_type& value);
    operator C() const;
};

template<class C>
inline bool ConcurrentContainer<C>::lockedEmpty() const noexcept
{
    std::lock_guard<std::mutex> lock{ mutex_ };
    return container_.empty();
}

template<class C>
inline typename C::size_type ConcurrentContainer<C>::lockedSize() const noexcept
{
    std::lock_guard<std::mutex> lock{ mutex_ };
    return container_.size();
}

template<class C>
inline void ConcurrentContainer<C>::lockedPush_back(const typename C::value_type& value)
{
    std::lock_guard<std::mutex> lock{ mutex_ };
    container_.push_back(value);
}

template<class C>
inline bool ConcurrentContainer<C>::lockedTry_pop(typename C::value_type& value)
{
    mutex_.lock();
    if (!container_.empty()) {
        value = container_.back();
        container_.pop_back();
        mutex_.unlock();
        return true;
    }
    else {
        mutex_.unlock();
        return false;
    }
}

template<class C>
inline ConcurrentContainer<C>::operator C() const
{
    std::lock_guard<std::mutex> lock{ mutex_ };
    return container_;
}

 

پاسخ داده شده شهریور 8, 1399 بوسیله ی toopak (امتیاز 2,458)   16 48 66
انتخاب شد آذر 14, 1399 بوسیله ی farnoosh
...