[vtkusers] stenciling problem-- is this code thread safe?

Mark Roden mmroden at gmail.com
Fri Feb 11 12:46:58 EST 2011


What I mean is, I have a vtkPolyData that has been DeepCopied and a
vtkImageData that is binary and distinct from all other data.

When I call the previously listed code with multiple threads (each
with their own polydata and binary image to fill in), the result is
generally a very garbled image.  If I call from a single thread in
series, one for each polydata/image pair, then everything works out
fine.

So it seems to me that something in the above series isn't thread
safe.  Each thread is declaring its own local objects, but is there
some global memory that's being used or accessed here?

On Fri, Feb 11, 2011 at 9:23 AM, David Gobbi <david.gobbi at gmail.com> wrote:
> Hi Mark,
>
> Explain in more detail what you mean by "call from multiple threads".
> VTK is, in general, not thread safe and you cannot call Update() on
> a filter from more than one thread.  Each thread needs to have its own
> set of filters.  And in general, you cannot feed a data object into more
> than one thread, because even simple methods like GetBounds() are
> not thread safe.
>
> When using VTK from multiple threads, it is necessary to apply
> extreme caution.
>
>  - David
>
>
> On Fri, Feb 11, 2011 at 10:00 AM, Mark Roden <mmroden at gmail.com> wrote:
>> Hi all,
>>
>> This code does not have threads enabled in vtk 5.6.1 (the code is in Java):
>>
>>        vtkLinearExtrusionFilter extruder = new vtkLinearExtrusionFilter();
>>        extruder.SetInput(data);
>>        extruder.SetVector(0, 0, spacing[2]);
>>        extruder.Update();
>>        vtkPolyData extruderOutput = extruder.GetOutput();
>>
>>        vtkPolyDataToImageStencil pol2Stenc = new vtkPolyDataToImageStencil();
>>        pol2Stenc.SetTolerance(0);
>>        pol2Stenc.SetInput(extruderOutput);
>>        pol2Stenc.SetInformationInput(binaryOrgan);
>>        pol2Stenc.Update();
>>        vtkImageStencilData pol2StencOutput = pol2Stenc.GetOutput();
>>
>>        // This is where the memory leak is!!!!
>>        vtkImageStencil stencil = new vtkImageStencil();
>>        stencil.SetInput(binaryOrgan);
>>        stencil.ReverseStencilOn();
>>        stencil.SetStencil(pol2StencOutput);
>>        stencil.Update();
>>
>>        // We're doing this because of an email to Mark
>>        // that says this will fix our memory issues
>>        final vtkImageData stencilOutput = stencil.GetOutput();
>>        final vtkImageData imageToKeep = new vtkImageData();
>>        imageToKeep.DeepCopy(stencilOutput);
>>        stencilOutput.Delete();
>>
>> When I try to call this code from multiple threads (ie, to create the
>> stencils for multiple organs), Bad Things happen, as in, the data are
>> entirely corrupted.  Is this code thread safe?
>>
>> Mark
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>



More information about the vtkusers mailing list