[vtk-developers] Weak pointers and thread safety

Bill Lorensen bill.lorensen at gmail.com
Tue Oct 12 10:36:44 EDT 2010


David,

We had similar issues a few years back with ITK. The current locking
mechanism is implemented in itkLightObject.cxx:
http://itk.org/gitweb?p=ITK.git;a=blob;f=Code/Common/itkLightObject.cxx;hb=dccd0de7b07d00f6b66c892217b0912dba2af2ff

It uses atomic operations.

Bill

On Tue, Oct 12, 2010 at 9:36 AM, David Gobbi <david.gobbi at gmail.com> wrote:
> Hi Ken,
>
> I see your point.  Indeed, applying a lock just to the WeakPointer
> doesn't really do anything.  There might be a way to just put a lock
> just around the object deletion decision in vtkObjectBase, without
> having it around every decref.  Or there might not.
>
>   David
>
> On Tue, Oct 12, 2010 at 7:12 AM, Moreland, Kenneth <kmorel at sandia.gov> wrote:
>> I’m skeptical that this code actually provides thread safety.  Your critical
>> section is only applied within a weak pointer.  It is not applied within
>> vtkObjectBase itself.  While the critical section is running some other
>> thread could call unreference and delete the object after the weak pointer
>> checks the reference but before the smart pointer increments the reference.
>>
>> I think the only way you are going to get true thread safety is to put a
>> critical section somewhere in the register/unregister calls.  However, that
>> might slow down everything appreciably.
>>
>> -Ken
>>
>>
>> On 10/11/10 10:43 PM, "Utkarsh Ayachit" <utkarsh.ayachit at kitware.com> wrote:
>>
>> That sounds like a good idea. You have my vote.
>>
>> Utkarsh
>>
>> On Mon, Oct 11, 2010 at 10:35 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>> 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
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtk-developers
>>>
>>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtk-developers
>>
>>
>>
>>
>>
>>    ****      Kenneth Moreland
>>     ***      Sandia National Laboratories
>> ***********
>> *** *** ***  email: kmorel at sandia.gov
>> **  ***  **  phone: (505) 844-8919
>>     ***      web:   http://www.cs.unm.edu/~kmorel
>>
>>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtk-developers
>
>



More information about the vtk-developers mailing list