我正在为下一个问题寻找模式或一些现成的解决方案:
具有功能的容器:
- 存储
的任意类型的一个元素- 从容器中取出元素时,它会变空
- 存储新元素时,会覆盖以前的内容
- 线程安全
醇>
我没有线程安全的天真实现:
template<typename T>
class Boxed {
T* _data;
public:
Boxed()
: _data(nullptr)
{}
Boxed(const T& data)
: _data(new T(data))
{}
~Boxed() {
if(_data != nullptr) {
delete _data;
}
}
inline
void setData(const T& data) {
if(_data != nullptr) {
delete _data;
}
_data = new T(data);
}
inline
T getData() {
T res(*_data);
delete _data;
_data = nullptr;
return res;
}
inline
bool empty() const {
return _data == nullptr;
}
inline
operator bool() cons {
return empty();
}
};
我将不胜感激任何帮助。
答案 0 :(得分:1)
使用大小为2的队列。使用互斥锁保护下划线数组/向量/双端队列。推送和弹出的逻辑是微不足道的。在推送时:如果不为空,则删除旧元素,插入新元素。在弹出:它是空的或大小为1,没有什么特别的事情比普通的流行音乐。因此它不会覆盖当前的但会替换它。差异是不可观察的。
签名:
class only_one
{
public:
bool push(T& e);
bool pop(T& e);
bool is_empty() const;
}
使用互斥锁/ condition_var的线程安全队列的实现可以在互联网的许多角落找到。 Example