Hi,
Im trying to make a thread safe Copy-on-write class, but i am unsure how.
I want a template class that stores a std::set<T> and i want to be able to add/remove elements while using iterators at the same time without conflicts. I would like to avoid making copies of the entire set each time i want to iterate over the elements. I have tried to use shared_ptr.unique() to decide when to create a new copy of the set but i have been unsuccessful since shared_ptr.use_count() stays at the value 1. I am doing something wrong.
I have tried to use something like this as my add function:
mutable boost::mutex _mutex;
typedef std::set<T> Set;
typedef boost::shared_ptr<Set> SetPtr;
void add(T element) {
boost::unique_lock<boost::mutex> lock(_mutex);
if (!(_mySet.unique() || _mySet == 0)) {
Set* tmp = _mySet.get();
_mySet = SetPtr(new Set(*tmp));
}
_mySet->insert(element);
}
My thought was that each time an iterator accesses the set the count would increase. Could i make it so (should i)?
Any other ideas about a thread safe implementation of a set of elements?
I hope someone can help me.
Thanks.