[vtk-developers] Weak pointers and thread safety

David Gobbi david.gobbi at gmail.com
Mon Oct 11 22:35:18 EDT 2010


Hi All,

The VTK weak pointer implementation is not thread safe because it can
be used just like a regular pointer, even though the object itself
might be deleted by a separate thread at any time.

By comparison, "safe" weak pointer like in boost and Qt cannot be used
in place of ordinary pointers.  Instead, in order to use them their
"GetPointer()"-like methods increment the reference count and then
return a smart pointer, which is guaranteed to be valid until it goes
out of scope:

vtkSmartPointer<SomeClass> smartPtr = weakPtr.GetPointer();
if (smartPtr.GetPointer() != 0)
  {
  // do something with smartPtr
  }
// reference count decremented when smartPtr goes out of scope

Because VTK's vtkWeakPointer::GetPointer() does not return a smart
pointer or do any thread locking, thread-safe use of vtkWeakPointer
requires the following:

vtkSimpleCriticalSection critSec;
critSec.Lock();
vtkSmartPointer<SomeClass> smartPtr = weakPtr.GetPointer();
critSec.Unlock();
if (smartPtr.GetPointer() != 0)
  {
  // do something with smartPtr
  }

If weakPtr.GetPointer() was changed to return a smart pointer, then it
could do the locking internally.  This change would be mostly, but not
completely, backwards compatible.  What do people think?

  David



More information about the vtk-developers mailing list