college/ws2010/gdi3/p5/MandelbrotPOSIX.class.h
2011-10-18 10:28:57 +02:00

77 lines
1.8 KiB
C++

#pragma once
#include "Mandelbrot.interface.h"
class CMandelbrotPOSIX: public IMandelbrot {
pthread_t* m_posixthreads;
static void* calcPOSIX(void* _params){
CParams* params = (CParams*) _params;
double startR = params->m_minRe + params->m_posix_begin*params->m_step;
for(int x_pos = params->m_posix_begin; x_pos < params->m_posix_end; x_pos++){
double startI = params->m_minIm;
for(int y_pos = params->m_y_height -1; y_pos >= 0; y_pos--){
checkNumber(*params, startR, startI, x_pos, y_pos);
startI += params->m_step;
}
startR += params->m_step;
}
}
void calc(CParams& params){
if(params.m_threads > params.m_x_width){
params.m_threads = params.m_x_width;
}
m_posixthreads = (pthread_t*)malloc(params.m_threads*sizeof(pthread_t)); // reserve memory for the threads
int array_step = params.m_x_width / params.m_threads;
for (unsigned i=0;i<params.m_threads-1;i++){
//calc array-part here
CParams* p = params.copy();
p->m_posix_begin = array_step*i;
p->m_posix_end = array_step*(i+1);
pthread_create(&m_posixthreads[i],NULL,calcPOSIX, (void *)p); // create thread
}
//last Thread
//calc array-part here
CParams* p = params.copy();
p->m_posix_begin = array_step*(params.m_threads-1);
p->m_posix_end = params.m_x_width;
pthread_create(&m_posixthreads[params.m_threads-1],NULL,calcPOSIX, (void *)p); // create thread
// wait for termination of all threads
for(unsigned i=0;i<params.m_threads;i++){
pthread_join(m_posixthreads[i],NULL);
}
// free memory
free(m_posixthreads);
return;
}
public:
CMandelbrotPOSIX(int x_width, int y_height, int iterations, unsigned int threads, bool sse){
Init(x_width,y_height,iterations,threads,sse);
}
~CMandelbrotPOSIX(){
Exit();
}
};