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.