cmtkThreadParameterArray.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2464 $
00026 //
00027 //  $LastChangedDate: 2010-10-19 09:54:33 -0700 (Tue, 19 Oct 2010) $
00028 //
00029 //  $LastChangedBy: torsten_at_home $
00030 //
00031 */
00032 
00033 #ifndef __cmtkThreadParameterArray_h_included_
00034 #define __cmtkThreadParameterArray_h_included_
00035 
00036 #include <cmtkconfig.h>
00037 
00038 #include <System/cmtkThreads.h>
00039 #include <System/cmtkThreadParameters.h>
00040 
00041 namespace
00042 cmtk
00043 {
00044 
00047 
00052 template<class TClass,class TParam = ThreadParameters<TClass> >
00053 class ThreadParameterArray
00054 {
00055 public:
00059   ThreadParameterArray
00060   ( TClass *const thisObject, const size_t numberOfThreads )
00061   {
00062     this->m_AsynchronousThreadsRunning = false;
00063     this->m_NumberOfThreads = numberOfThreads;
00064     this->m_Ptr = Memory::AllocateArray<TParam>( numberOfThreads );
00065     for ( size_t i = 0; i < numberOfThreads; ++i )
00066       {
00067       this->m_Ptr[i].thisObject = thisObject;
00068       this->m_Ptr[i].ThisThreadIndex = i;
00069       this->m_Ptr[i].NumberOfThreads = numberOfThreads;
00070       this->m_Ptr[i].m_ThreadID = 0;
00071       }
00072   }
00073 
00075   ~ThreadParameterArray()
00076   {
00077     if ( this->m_AsynchronousThreadsRunning )
00078       this->CancelAsynchronousThreads();
00079     Memory::DeleteArray( this->m_Ptr );
00080   }
00081 
00083   const TParam& operator[]( const size_t i ) const { return this->m_Ptr[i]; }
00084 
00086   TParam& operator[]( const size_t i ) { return this->m_Ptr[i]; }
00087 
00089   TParam* GetPtr() { return this->m_Ptr; }
00090 
00092   const TParam* GetPtr() const { return this->m_Ptr; }
00093 
00095   size_t GetNumberOfThreads() const { return this->m_NumberOfThreads; }
00096 
00098   void RunInParallel( ThreadFunction threadCall )
00099   {
00100     Threads::RunThreads( threadCall, this->GetNumberOfThreads(), this->GetPtr(), sizeof( TParam ) );
00101   }
00102 
00104   void RunInParallelAsynchronous( ThreadFunction threadCall );
00105 
00107   void JoinAsynchronousThreads();
00108 
00110   void CancelAsynchronousThreads();
00111 
00113   bool IsRunning( const size_t idx )
00114   {
00115     return this->m_Ptr[idx].m_ThreadID;
00116   }
00117 
00119   void RunInParallelFIFO(ThreadFunction threadCall, const size_t numberOfThreadsTotal, const size_t firstThreadIdx = 0 );
00120     
00121 private:
00123   size_t m_NumberOfThreads;
00124   
00126   TParam* m_Ptr;
00127  
00129   bool m_AsynchronousThreadsRunning;
00130 };
00131 
00133 
00134 } // namespace cmtk
00135 
00136 #include "cmtkThreadParameterArray.txx"
00137 
00138 #endif // #ifndef __cmtkThreadParameterArray_h_included_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines