13 #include <itkFastMutexLock.h> 14 #include <itkMultiThreader.h> 15 #include <itkSemaphore.h> 32 itk::FastMutexLock *mutex;
33 itk::Semaphore *semaphore;
34 itk::Semaphore *mayIRun;
40 std::cout <<
"Getting thread info data... ";
41 itk::MultiThreader::ThreadInfoStruct *threadInfo =
static_cast<itk::MultiThreader::ThreadInfoStruct *
>(param);
45 std::cout <<
"[FAILED]" << std::endl;
48 std::cout <<
"[PASSED]" << std::endl;
50 std::cout <<
"Getting user data from thread... ";
51 UserData *userData =
static_cast<UserData *
>(threadInfo->UserData);
55 std::cout <<
"[FAILED]" << std::endl;
58 std::cout <<
"[PASSED]" << std::endl;
61 std::cout <<
"generate 10000 results";
62 for (
int i = 1; i <= 10000; ++i)
64 userData->mutex->Lock();
65 *(userData->intPointer) += 1;
66 userData->mutex->Unlock();
67 userData->semaphore->Up();
69 std::cout <<
"[PASSED]" << std::endl;
71 std::cout <<
"waiting for main thread's signal... " << std::endl;
73 userData->mayIRun->Down();
74 std::cout <<
"got main thread's signal... " << std::endl;
77 for (
int i = 1; i <= 10000; ++i)
79 userData->mutex->Lock();
80 *(userData->intPointer) += 1;
81 userData->mutex->Unlock();
84 userData->semaphore->Up();
86 return ITK_THREAD_RETURN_VALUE;
91 itk::MultiThreader::Pointer threader = itk::MultiThreader::New();
95 itk::Semaphore::Pointer m_ResultAvailable = itk::Semaphore::New();
96 m_ResultAvailable->Initialize(0);
98 itk::Semaphore::Pointer m_RunThreadRun = itk::Semaphore::New();
99 m_RunThreadRun->Initialize(0);
101 itk::FastMutexLock::Pointer m_Mutex = itk::FastMutexLock::New();
104 userData.intPointer = &localInt;
105 userData.mutex = m_Mutex.GetPointer();
106 userData.semaphore = m_ResultAvailable.GetPointer();
107 userData.mayIRun = m_RunThreadRun.GetPointer();
110 int thread_id = threader->SpawnThread(pointer, &userData);
113 for (
int i = 1; i <= 10000; ++i)
114 m_ResultAvailable->Down();
116 std::cout <<
"signaling by semaphore thread->main ";
117 if (localInt == 10000)
118 std::cout <<
"[PASSED]" << std::endl;
121 std::cout <<
"[FAILED] localInt == " << localInt << std::endl;
127 m_RunThreadRun->Up();
128 for (
int i = 1; i <= 10000; ++i)
135 std::cout <<
"waiting for thread's signal" << std::endl;
137 m_ResultAvailable->Down();
138 std::cout <<
"got thread's signal" << std::endl;
141 std::cout <<
"sharing a mutex protected variable among threads";
142 if (localInt == 20000)
143 std::cout <<
"[PASSED]" << std::endl;
146 std::cout <<
"[FAILED] localInt == " << localInt << std::endl;
151 std::cout <<
"waiting for idling thread ";
152 threader->TerminateThread(thread_id);
153 std::cout <<
"[PASSED]" << std::endl;
155 std::cout <<
"Whole test [PASSED]" << std::endl;
int mitkITKThreadingTest(int, char *[])
ITK_THREAD_RETURN_TYPE ThreadedFunction(void *param)