Mam taką klasę ( w przestrzeni nazw threads ):
// tu jest jeszcze trochę kodu, ale nie istotnego oraz #include <pthread.h>
template < class T > class thread {
private:
void* (*func)( void* ); ///< Wskaźnik na funkcję, która ma być wątkiem.
pthread_t th; ///<
T* args; ///< Argumenty przekazywane do funkcji
//pthread_attr_t* param;
bool state; ///< status wątku
public:
/**
* @brief Konstruktor klasy @b Thread
*
* @param _func Wskaźnik do fungkcji, która ma zostać wywołana jako osobny wątek.
* @param _args Wskaźnik do argumentów, które mają zostać przekazane nowemu wątkowi
* @return
*/
thread( void*(*_func)( void* ), T* _args ) :
func( _func ), args( _args ), state( false ) {
}
~thread() {
if( !state )
join();
}
/**
* @brief Uruchamia wątek.
* Rzuca wyjątkiem threadError, który zawiera string opisujący błąd, który wystąpił.
* @param _param Parametry, które mają zostać przekazane do funkcji tworzącej wątek
* @return Zwraca NULL jeśli wątek został wywołany poprawnie
*/
void start( const pthread_attr_t* _param = 0 ) throw(threadError) {
pthread_create( &th, _param, func, (void*) args );
state = true;
}
/**
* @brief Kończy działanie wątku.
*/
int stop() {
int ret = pthread_cancel( th );
th = NULL;
state = false;
return ret;
}
void join() { ///< Czeka na zakończenie wątku
pthread_join( th, NULL );
state = false;
}
bool operator ==( thread< T > _cmp ) const {
return pthread_equal( th, _cmp.th );
}
};
i korzystam z niej:
#include <iostream>
#include <easyLib/Threads/Thread.hpp>
using namespace std;
void* thread( void* args ) {
int* par = (int*)args;
for( int i = 0; i < 10; i++ )
cout << "Watek nr. " << *par << ", powtorzenie nr. " << i;
delete par;
th_exit(0);
}
int main( int argc, char* argv[] ) {
//int i = 10;
threads::thread< int > th( thread, NULL );
th.start();
th.join();
return 0;
}
I ciągle mi wywala błąd Segmentation Fault. Wcześniej działało bez zarzutów i teraz coś się popsuło.