Is there an Interlocked for this?

Please note - these builds are for VS2008/VS2010 builds I cannot use any 11 constructs.

Imagine I have subscribers listening to some publisher. My publisher has a container of subscriber pointers. In my void detach(ISubscriber *), instead of locking the subscriber list, I will "NULL" out the pointer, for lack of a better word, for that subscriber.

1
2
//My container in the publisher.  Inserts to not invalidate, removals only invalidate iterators pointing to the removed element, for this reason we NULL
Container<ISubscriber *> myContainer;


Now in the publisher...

1
2
3
4
5
6
void NotifySubscribers(){
foreach(subscriber in container){
   if(subscriber)//This is my problem
      subscriber->notify()
   }
}


Line 3 - pointer is tested and is pointing to valid object.
Before line 4 is executed, another thread NULLs the subscriber.
Line 4 - Boom.

My Question, is there a way that I can use some sort of Interlocked something such that the test and call is atomic.

e.g. for a reference counted object in the destructor, something like this works

1
2
3
4
RefCountObject::~RefCountObject(){
   if(InterlockedDecrement(&m_count) == 0)
      delete m_data;
}


Here, the reference counter is decremented and tested against zero automically, then and only then if equal to zero, the data is released.

Is there a way for me to do this for calling a function based on the validity of a pointer?
Last edited on
Topic archived. No new replies allowed.