[solved] Problem z wątkami ( klasa )

0

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.

0

Jako argument dajesz NULL, a później *par.

0

Rzeczywiście nie zauważyłem [wstyd]

Jednak teraz dla odmiany wywala mi na błędzie

*** glibc detected *** /home/hauleth/workspace/Cpp/Test/Debug/Test: double free or corruption (out): 0xbfe45738 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7cf93f4]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7cfb456]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7ed7031]
/home/hauleth/workspace/Cpp/Test/Debug/Test[0x8048b73]
/lib/tls/i686/cmov/libpthread.so.0[0xb7c7750f]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7d6b7ee]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:02 2188093    /home/hauleth/workspace/Cpp/Test/Debug/Test
08049000-0804a000 r--p 00001000 08:02 2188093    /home/hauleth/workspace/Cpp/Test/Debug/Test
0804a000-0804b000 rw-p 00002000 08:02 2188093    /home/hauleth/workspace/Cpp/Test/Debug/Test
09652000-09673000 rw-p 09652000 00:00 0          [heap]
b7300000-b7321000 rw-p b7300000 00:00 0 
b7321000-b7400000 ---p b7321000 00:00 0 
b746e000-b746f000 ---p b746e000 00:00 0 
b746f000-b7c71000 rw-p b746f000 00:00 0 
b7c71000-b7c86000 r-xp 00000000 08:02 829948     /lib/tls/i686/cmov/libpthread-2.8.90.so
b7c86000-b7c87000 r--p 00014000 08:02 829948     /lib/tls/i686/cmov/libpthread-2.8.90.so
b7c87000-b7c88000 rw-p 00015000 08:02 829948     /lib/tls/i686/cmov/libpthread-2.8.90.so
b7c88000-b7c8a000 rw-p b7c88000 00:00 0 
b7c8a000-b7de2000 r-xp 00000000 08:02 828111     /lib/tls/i686/cmov/libc-2.8.90.so
b7de2000-b7de4000 r--p 00158000 08:02 828111     /lib/tls/i686/cmov/libc-2.8.90.so
b7de4000-b7de5000 rw-p 0015a000 08:02 828111     /lib/tls/i686/cmov/libc-2.8.90.so
b7de5000-b7de8000 rw-p b7de5000 00:00 0 
b7de8000-b7df5000 r-xp 00000000 08:02 729158     /lib/libgcc_s.so.1
b7df5000-b7df6000 r--p 0000c000 08:02 729158     /lib/libgcc_s.so.1
b7df6000-b7df7000 rw-p 0000d000 08:02 729158     /lib/libgcc_s.so.1
b7df7000-b7e1b000 r-xp 00000000 08:02 828115     /lib/tls/i686/cmov/libm-2.8.90.so
b7e1b000-b7e1c000 r--p 00023000 08:02 828115     /lib/tls/i686/cmov/libm-2.8.90.so
b7e1c000-b7e1d000 rw-p 00024000 08:02 828115     /lib/tls/i686/cmov/libm-2.8.90.so
b7e1d000-b7e1e000 rw-p b7e1d000 00:00 0 
b7e1e000-b7f01000 r-xp 00000000 08:02 829941     /usr/lib/libstdc++.so.6.0.10
b7f01000-b7f02000 ---p 000e3000 08:02 829941     /usr/lib/libstdc++.so.6.0.10
b7f02000-b7f06000 r--p 000e3000 08:02 829941     /usr/lib/libstdc++.so.6.0.10
b7f06000-b7f07000 rw-p 000e7000 08:02 829941     /usr/lib/libstdc++.so.6.0.10
b7f07000-b7f0d000 rw-p b7f07000 00:00 0 
b7f0d000-b7f0f000 r-xp 00000000 08:02 2188110    /usr/lib/libeasyLib.so
b7f0f000-b7f10000 r--p 00001000 08:02 2188110    /usr/lib/libeasyLib.so
b7f10000-b7f11000 rw-p 00002000 08:02 2188110    /usr/lib/libeasyLib.so
b7f26000-b7f29000 rw-p b7f26000 00:00 0 
b7f29000-b7f43000 r-xp 00000000 08:02 729901     /lib/ld-2.8.90.so
b7f43000-b7f44000 r-xp b7f43000 00:00 0          [vdso]
b7f44000-b7f45000 r--p 0001a000 08:02 729901     /lib/ld-2.8.90.so
b7f45000-b7f46000 rw-p 0001b000 08:02 729901     /lib/ld-2.8.90.so
bfe31000-bfe46000 rw-p bffeb000 00:00 0          [stack]

Jednak jestem jeszcze młody i nie za bardzo rozumiem o co tu chodzi [wstyd]

0

Pokaż kod, który jak mniemam poprawiłeś.

PS. jeśli easyLib jest twoja, to popraw operatory przypisania z klasach simple_ptr, simple_array1D itd., bo są niebezpieczne (vide destruktor).

0

ok poprawię.
Zmieniłem tylko:

        int i = 10;
        threads::thread< int > th( thread, &i );

// PS simple_ptr robione wg http://xion.org.pl/productions/texts/coding/simple-gc-in-cpp/

0

W funkcji wątka usuwasz i operatorem delete.

// PS simple_ptr robione wg http://xion.org.pl/productions/texts/coding/simple-gc-in-cpp/

Tylko że tam masz zliczanie referencji, a to zasadnicza różnica.

0

Ok, zobaczę co da się zrobić, ale potem będzie jeszcze dodany GC :)

0

proszę, zmień temat! (2 dni masz)

1 użytkowników online, w tym zalogowanych: 0, gości: 1