ich habe mir für meinen Raytracer eine kleine Thread-Klasse geschrieben, um die Strahlen parallel berechnen zu lassen. Allerdings habe ich das Problem, dass pthread_create irgendwann nichtmehr aufgerufen wird. Muss ich da irgendwas wieder freigeben? Ich habe mich da an http://www.linuxselfhelp.com/HOWTO/C++P ... TO-18.html orientiert.
Meine Thread-Klasse sieht so aus:
Code: Alles auswählen
class Thread {
public:
Thread();
Thread(Szene *szene);
virtual ~Thread();
void Run(unsigned int x,unsigned int y);
bool finished() { return this->m_finished; }
FARBE GetFarbe() const { return this->m_farbe; }
int GetX() const { return this->m_x; }
int GetY() const { return this->m_y; }
void *run();
private:
Szene *m_szene;
bool m_finished;
unsigned int m_x;
unsigned int m_y;
FARBE m_farbe;
pthread_t m_thread;
};
Thread::Thread() {
this->m_x=0;
this->m_y=0;
this->m_finished=true;
this->m_farbe=FARBE(0,0,0);
this->m_szene=NULL;
this->m_mutex=PTHREAD_MUTEX_INITIALIZER;
}
Thread::Thread(Szene *szene) {
this->m_x=0;
this->m_y=0;
this->m_finished=true;
this->m_farbe=FARBE(0,0,0);
this->m_szene=szene;
this->m_mutex=PTHREAD_MUTEX_INITIALIZER;
}
Thread::~Thread() {
this->m_x=0;
this->m_y=0;
this->m_finished=true;
this->m_farbe=FARBE(0,0,0);
this->m_szene=NULL;
}
void *runthread(void *thread) {
((Thread*)thread)->Run();
return 0;
}
void Thread::Run(unsigned int x,unsigned int y) {
if(this->m_szene==NULL)
throw new Exception(NULL,__FILE__,__LINE__,"Fehler","Szene im Thread nicht gesetzt!");
this->m_x=x;
this->m_y=y;
this->m_finished=false;
pthread_create(&this->m_thread,NULL,runthread,(void*)this);
}
void *Thread::run() {
this->m_farbe=this->m_szene->CalcRay(this->m_x,this->m_y);
this->m_finished=true;
return 0;
}
Code: Alles auswählen
Thread *threads = new Thread[maximal_threads];
for(unsigned int i=0;i<maximal_threads;i++) {
threads[i] = Thread(szene);
}
Code: Alles auswählen
for(unsigned int y=0;y<screen_height;y++) {
for(unsigned int x=0;x<screen_width;x++) {
bool thread_found=false;
while(!thread_found) {
for(unsigned int t=0;t<maximal_threads;t++) {
if(threads[t].finished()) {
color[threads[t].GetX()][threads[t].GetY()]=threads[t].GetFarbe();
threads[t]=Thread(szene);
threads[t].Run(x,y);
thread_found=true;
break;
}
}
if(thread_found)
break;
usleep(100);
}
}
}
Das sind meine ersten Gehversuche mit Threads in C(++), hab nurmal beim Studium Threads mit Java gemacht (aber da natürlich auch nicht so viele).
Ich hoffe, irgendjemand findet den Fehler und kann mir helfen.
Vielen Dank schonmal im Voraus
Grüße
hundvdf