Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <itkMultiThreader.h>
00019 #include <itkSemaphore.h>
00020 #include <itkFastMutexLock.h>
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 class UserData
00034 {
00035 public:
00036 int* intPointer;
00037 itk::FastMutexLock* mutex;
00038 itk::Semaphore* semaphore;
00039 itk::Semaphore* mayIRun;
00040 };
00041
00042
00043 ITK_THREAD_RETURN_TYPE ThreadedFunction(void* param)
00044 {
00045 std::cout<<"Getting thread info data... ";
00046 itk::MultiThreader::ThreadInfoStruct* threadInfo = static_cast<itk::MultiThreader::ThreadInfoStruct*>(param);
00047
00048 if (!threadInfo)
00049 {
00050 std::cout<<"[FAILED]"<<std::endl;
00051 exit(EXIT_FAILURE);
00052 }
00053 std::cout<<"[PASSED]"<<std::endl;
00054
00055
00056 std::cout<<"Getting user data from thread... ";
00057 UserData* userData = static_cast<UserData*>(threadInfo->UserData);
00058
00059 if (!userData)
00060 {
00061 std::cout<<"[FAILED]"<<std::endl;
00062 exit(EXIT_FAILURE);
00063 }
00064 std::cout<<"[PASSED]"<<std::endl;
00065
00066
00067 std::cout<<"generate 10000 results";
00068 for (int i = 1; i <= 10000; ++i)
00069 {
00070 userData->mutex->Lock();
00071 *(userData->intPointer) += 1;
00072 userData->mutex->Unlock();
00073 userData->semaphore->Up();
00074 }
00075 std::cout<<"[PASSED]"<<std::endl;
00076
00077 std::cout<<"waiting for main thread's signal... "<<std::endl;;
00078 userData->mayIRun->Down();
00079 std::cout<<"got main thread's signal... "<<std::endl;
00080
00081
00082 for (int i = 1; i <= 10000; ++i)
00083 {
00084 userData->mutex->Lock();
00085 *(userData->intPointer) += 1;
00086 userData->mutex->Unlock();
00087 }
00088
00089 userData->semaphore->Up();
00090
00091 return ITK_THREAD_RETURN_VALUE;
00092 }
00093
00094 int mitkITKThreadingTest(int , char* [])
00095 {
00096 itk::MultiThreader::Pointer threader = itk::MultiThreader::New();
00097
00098 int localInt(0);
00099
00100 itk::Semaphore::Pointer m_ResultAvailable = itk::Semaphore::New();
00101 m_ResultAvailable->Initialize(0);
00102
00103 itk::Semaphore::Pointer m_RunThreadRun = itk::Semaphore::New();
00104 m_RunThreadRun->Initialize(0);
00105
00106 itk::FastMutexLock::Pointer m_Mutex = itk::FastMutexLock::New();
00107
00108 UserData userData;
00109 userData.intPointer = &localInt;
00110 userData.mutex = m_Mutex.GetPointer();
00111 userData.semaphore = m_ResultAvailable.GetPointer();
00112 userData.mayIRun = m_RunThreadRun.GetPointer();
00113
00114 itk::ThreadFunctionType pointer = &ThreadedFunction;
00115 int thread_id = threader->SpawnThread( pointer, &userData );
00116
00117
00118 for (int i = 1; i <= 10000; ++i)
00119 m_ResultAvailable->Down();
00120
00121 std::cout<<"signaling by semaphore thread->main ";
00122 if (localInt == 10000)
00123 std::cout<<"[PASSED]"<<std::endl;
00124 else
00125 {
00126 std::cout<<"[FAILED] localInt == "<< localInt <<std::endl;
00127 return EXIT_FAILURE;
00128 }
00129
00130
00131 localInt = 0;
00132 m_RunThreadRun->Up();
00133 for (int i = 1; i <= 10000; ++i)
00134 {
00135 m_Mutex->Lock();
00136 ++localInt;
00137 m_Mutex->Unlock();
00138 }
00139
00140 std::cout<<"waiting for thread's signal"<<std::endl;;
00141 m_ResultAvailable->Down();
00142 std::cout<<"got thread's signal"<<std::endl;;
00143
00144 std::cout<<"sharing a mutex protected variable among threads";
00145 if (localInt == 20000)
00146 std::cout<<"[PASSED]"<<std::endl;
00147 else
00148 {
00149 std::cout<<"[FAILED] localInt == "<< localInt <<std::endl;
00150 return EXIT_FAILURE;
00151 }
00152
00153
00154 std::cout<<"waiting for idling thread ";
00155 threader->TerminateThread( thread_id );
00156 std::cout<<"[PASSED]"<<std::endl;
00157
00158 std::cout<<"Whole test [PASSED]"<<std::endl;
00159
00160 return EXIT_SUCCESS;
00161 }