[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