То, что вы делаете:
check = pthread_create( &tid[i], NULL, tFunction,
(void *) 4
);
И трактуете 4-й аргумент как int *
, которыйочевидно нет.Когда вы разыменовываете адрес 4 в tFunction
, вы получаете segfault.
Если вы хотите передать указатель на int
со значением 4, передайте адресint
переменная, то есть:
#include <pthread.h>
#define CONSTANT 4
void * tFunction ( void * param )
{
int num = * (int *) param; /* Seg fault line */
}
int main(void)
{
int arg = CONSTANT;
pthread_t tid[CONSTANT];
int i, check;
for( i = 0; i < CONSTANT; i++ )
{
check = pthread_create( &tid[i], NULL, tFunction, (void *) &arg );
}
return 0;
}
РЕДАКТИРОВАТЬ : pthread_join
будет полезна, так что вы можете дождаться завершения ваших потоков перед выходом из вашей программы.
EDIT2 : Если вы не читали комментарии: вы должны убедиться, что передаете локальную переменную (как в этом примере, который должен был показать очень незначительные изменения в его коде, чтобы получить его).что все новые потоки заканчивают работу до того, как переменная выходит из области видимости с помощью pthread_join
, или для динамического выделения памяти для переменной в куче.