<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-MailFormatvorlage17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=DE-AT link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I only tested it in a pipeline but the crash is not always in the New() method, I also tried to create all vtk Objects in the main thread and give the treads a pointer to the vtk objects, so the threads are only using vtk objects without creating or deleting them but they also crash anywhere. The pipeline was:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>MyImage of our internal software lib (with a data pointer) which is internally splitted into image blocks<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>For each thread<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>{<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Take one block of MyImage<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create a vtkImageData of the block<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Make vtkMarchingCubes<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Make Mutex.lock<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddInput of vtkAppendPolyData<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Make Mutex.unlock<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>} until each block was calculated<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Output of filter is output of vtkAppendPolyData<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I tried also to comment the mutex and vtkAppendPolyData stuff so there was no vtk object shared between threads, also crashed.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Currently I solved the problem over copying the raw VTK code of every filter of my pipeline (only vtkMarchingCubes with its internal vtkMergePoints) and use this code in my multithreaded function. Since my filter only uses the vtkMarchingCubes and has a non vtk object as input (image from our internal lib), this works well. The return value is a std::vector of points and indices which are then concatenated in the main thread into a vtkPolyData, so the threads are now completely vtk object free.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> I got a speed improvement of marching cubes over a blockwise sampled image of factor 5 (8 cores) in comparison to calculating marching cubes over one single big vtkImageData so in my opinion the vtkMarchingCubes should be implemented in a multithreaded manner too, but it is not possible because of the stupid behavior&#8230;.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I also have a&nbsp; code pipeline with the vtkHardwareSelector which detects a visible surface of a renderer in offscreen mode which could be also made multithreaded (for different camera positions) but the rendering code pipeline is a little bit too complex for me to reimplement it in vtk Object free code&#8230;.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If anyone is interested in exact code I could send it (both) but as I told there is an object of our internal software lib as input but it should be easily understandable&#8230;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><b><span lang=DE style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>Von:</span></b><span lang=DE style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Berk Geveci [mailto:berk.geveci@kitware.com] <br><b>Gesendet:</b> Dienstag, 04. September 2012 16:37<br><b>An:</b> David E DeMarle<br><b>Cc:</b> Lodron, Gerald; (vtkusers@vtk.org)<br><b>Betreff:</b> Re: [vtkusers] thread safety<o:p></o:p></span></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Currently there are a lot of pitfalls in using VTK objects in a multi-threaded application. I am working on addressing some of them and I will also create a document describing what is and what is not possible.<o:p></o:p></p><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>What Gerald is describing should be possible. In fact, I have done it many times in the past. I can't answer why the crash is happening without doing some experimentation. Gerald: does the crash within a minimal code that simply create vtkImageData in multiple threads? Or does it need the full-blown filter to happen?<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'>-berk<o:p></o:p></p><div><p class=MsoNormal>On Wed, Aug 29, 2012 at 12:14 PM, David E DeMarle &lt;<a href="mailto:dave.demarle@kitware.com" target="_blank">dave.demarle@kitware.com</a>&gt; wrote:<o:p></o:p></p><p class=MsoNormal>Unfortunately, VTK isn't thread safe, with the exception being<br>operations (mostly limited to array access methods that are declared<br>to be thread safe in doxygen) that take place in the Threaded* methods<br>in subclasses of vtkThreadedImageAlgorithm.<br><br>Berk is working on more wide scale thread/SMP parallel support, but<br>that won't be in until after 6.0.<br><br>If anyone on the list has had success in writing multithreaded VTK<br>programs, I'ld like to see examples along with descriptions of what<br>your approach was and what you had to mutex protect.<br><br>David E DeMarle<br>Kitware, Inc.<br>R&amp;D Engineer<br>21 Corporate Drive<br>Clifton Park, NY 12065-8662<br>Phone: <a href="tel:518-881-4909">518-881-4909</a><o:p></o:p></p><div><div><p class=MsoNormal><br><br>On Wed, Aug 29, 2012 at 2:47 AM, Lodron, Gerald<br>&lt;<a href="mailto:Gerald.Lodron@joanneum.at">Gerald.Lodron@joanneum.at</a>&gt; wrote:<br>&gt; Hi<br>&gt;<br>&gt; I programmed an own vtk Filter which internally has multiple threads. In<br>&gt; each thread I create a vtkImageData object using<br>&gt;<br>&gt; vtkSmartPointer&lt;vtkImageData&gt; &nbsp; &nbsp; &nbsp; oImage = vtkImageData::New();<br>&gt;<br>&gt; the problem is that sometimes the New() operator crashes, I debugged it the<br>&gt; the line 61 of vtkImageData.cxx:<br>&gt;<br>&gt; this-&gt;Information-&gt;Set(vtkDataObject::DATA_EXTENT(), this-&gt;Extent, 6);<br>&gt;<br>&gt; whereby the exact crash is in vtkInformationIntegerPointerKey.cxx on line<br>&gt; 58:<br>&gt;<br>&gt; if(this-&gt;RequiredLength &gt;= 0 &amp;&amp; length != this-&gt;RequiredLength)<br>&gt;<br>&gt; wherehy the &#8220;this&#8221; pointer is zero. I am not so deep familiar with that, any<br>&gt; suggestions?<br>&gt;<br>&gt; DI Gerald Lodron<br>&gt;<br>&gt; Machine Vision Applications<br>&gt;<br>&gt; DIGITAL - Institute for Information and Communication Technologies<br>&gt;<br>&gt; JOANNEUM RESEARCH Forschungsgesellschaft mbH<br>&gt; Steyrergasse 17, 8010 Graz, AUSTRIA<br>&gt;<br>&gt; phone: &nbsp; <a href="tel:%2B43-316-876-1751">+43-316-876-1751</a> &nbsp; &nbsp; &nbsp; personal fax: <a href="tel:%2B43-316-876-91751">+43-316-876-91751</a><br>&gt; mobile: &nbsp; <a href="tel:%2B43-699-1876-1751">+43-699-1876-1751</a> &nbsp; &nbsp; &nbsp;general fax: <a href="tel:%2B43-316-876-1720">+43-316-876-1720</a><br>&gt; web: <a href="http://www.joanneum.at/digital" target="_blank">http://www.joanneum.at/digital</a><br>&gt; e-mail: <a href="mailto:gerald.lodron@joanneum.at">gerald.lodron@joanneum.at</a><br>&gt;<br>&gt;<br>&gt;<br>&gt;<o:p></o:p></p></div></div><p class=MsoNormal>&gt; _______________________________________________<br>&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>&gt;<br>&gt; Visit other Kitware open-source projects at<br>&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>&gt;<br>&gt; Please keep messages on-topic and check the VTK FAQ at:<br>&gt; <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>&gt;<br>&gt; Follow this link to subscribe/unsubscribe:<br>&gt; <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>&gt;<br>_______________________________________________<br>Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br><br>Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br><br>Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br><br>Follow this link to subscribe/unsubscribe:<br><a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><o:p></o:p></p></div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div></div></body></html>