PDA

View Full Version : pthread e system()


silentman
16-07-2004, 10:06
Un bel problema:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>

void * thread_function(void *x);

int main(int argc, char *argv[])
{
int rc;
pthread_t tid;
void *rp;

if ( pthread_create(&tid, NULL, thread_function, rp) != 0 ) {
return(-1);
}

system ("/bin/touch ./STOPPED");

return(0);
}

void * thread_function(void *x)
{
int count=0;
while(1)
{
printf("thread: %d\n",count++);
sleep(1);
}
return(NULL);
}


A valle dell'esecuzione della pthread_create(), il programma rimane bloccato sulla system(), il file "STOPPED" non viene creato.

Compilato con:
CC= g++ -fPIC $(CFLAGS) -g -O3 -static

su vari kernel, stesso risultato.

Provato anche a:
- creare il thread in DETACHED state
- uscire dal thread con pthread_exit() invece di return()
- usare pthread_cancel() dal main thread

ottenendo sempre lo stesso risultato.
Idee?

"Astenersi perditempo"

silentman
16-07-2004, 12:30
Aggiornamento:

$ uname -r
2.4.20-8smp
$ gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

Su questo sistema funziona.

sviat
22-07-2004, 09:42
sviatoslav@worklab:/home/sviatoslav> cc -pthread -fPIC -o silent silent.c
sviatoslav@worklab:/home/sviatoslav> ./silent
thread: 0
sviatoslav@worklab:/home/sviatoslav>

compilato su FreeBSD 5.2.1
mi crea anche STOPPED

P.S: ho cambiato il path di /bin/touch in /usr/bin/touch.

silentman
22-07-2004, 09:50
Avevo dimenticato di postare per chiudere il thread, ma ho capito il perche'. La macchina su cui sviluppavo in origine e' piuttosto vecchia

$ uname -r
2.2.14-5.0
$ gcc --version
egcs-2.91.66
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)

e' bastato upgradare kernel, gcc, e pthread per far si che tutto andasse alla perfezione.

sviat
22-07-2004, 10:04
ah ecco: infatti non vedevo nulla di strano in quel code