کانتینر به صورت جنریک دریافت میشه و شما عملیات پایه ای را با 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_;
}