problem handling POSIX thread on FreeBSD
Pablo Mora
fbsd.hackers at gmail.com
Mon Jun 27 05:32:48 GMT 2005
/* file: test.c */
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
char buffer[512];
pthread_mutex_t mutex, mutex2;
pthread_t hilo1, hilo2;
void f1(void* ptr)
{
int i,n=10;
int valor=0;
char*p=(char*)ptr;
for(i=0;i<n;i++)
{
pthread_mutex_lock(&mutex);
sscanf(p,"%d",&valor);
printf("\thilo1: puntero contiene %d\n", valor);
valor=i*3;
sprintf(p, "%d",valor);
pthread_mutex_unlock(&mutex2);
}
valor=(int)pthread_self();
printf("finaliza hilo1 con id %d\n", valor);
pthread_exit(&valor);
}
void f2(void* ptr)
{
int i,n=10;
int valor=0;
char*p=(char*)ptr;
for(i=0;i<n;i++)
{
pthread_mutex_lock(&mutex2);
sscanf(p,"%d",&valor);
printf("hilo2: puntero contiene %d\n", valor);
valor=i*2;
sprintf(p, "%d",valor);
pthread_mutex_unlock(&mutex);
}
valor=(int)pthread_self();
printf("finaliza hilo2 con id %d\n", valor);
pthread_exit(&valor);
}
int main()
{
pthread_attr_t atributos;
//pthread_mutexattr_t mutexattr; - solaris
memset(buffer, '\0', sizeof(buffer));
/*
if(pthread_mutexattr_setpshared(&mutexattr,PTHREAD_PROCESS_PRIVATE)!=0)
//solaris
{
perror("pthread_mutexattr_setpshared");
exit(-12);
}
*/
pthread_mutex_init(&mutex, NULL); //linux
pthread_mutex_init(&mutex2, NULL); //linux
pthread_mutex_lock(&mutex2); /
/*if(pthread_mutex_init(&mutex, &mutexattr)!=0) //solaris
{
perror("pthread_mutex_init");
exit(-2);
}*/
if(pthread_attr_init(&atributos) < 0)
{
perror("pthread_attr_init");
exit(-1);
}
if(pthread_attr_setscope(&atributos,PTHREAD_SCOPE_PROCESS) < 0)
{
perror("pthread_attr_setscope");
exit(-2);
}
if(pthread_create (&hilo1, &atributos, (void*)&f1, (void*)buffer)<0)
{
perror("pthread_create hilo1");
exit(-2);
}
if(pthread_create(&hilo2, &atributos, (void*)&f2, (void*)buffer)<0)
{
perror("pthread_create hilo2");
exit(-2);
}
if(pthread_join(hilo2, NULL)<0)
{
perror("pthread_join hilo1 ");
exit(-3);
}
puts("fin hilo 2");
/*if(pthread_join(hilo1, NULL)<0)
{
perror("pthread_join hilo2 ");
exit(-3);
}*/
pthread_mutex_destroy(&mutex);
exit(0);
}
output in solaris and linux: (gcc test.c -lpthread)
hilo1: puntero contiene 0
hilo2: puntero contiene 0
hilo1: puntero contiene 0
hilo2: puntero contiene 3
hilo1: puntero contiene 2
hilo2: puntero contiene 6
hilo1: puntero contiene 4
hilo2: puntero contiene 9
hilo1: puntero contiene 6
hilo2: puntero contiene 12
hilo1: puntero contiene 8
hilo2: puntero contiene 15
hilo1: puntero contiene 10
hilo2: puntero contiene 18
hilo1: puntero contiene 12
hilo2: puntero contiene 21
hilo1: puntero contiene 14
hilo2: puntero contiene 24
hilo1: puntero contiene 16
finaliza hilo1 con id 1082231728
hilo2: puntero contiene 27
finaliza hilo2 con id 1090624432
fin hilo 2
output on FreeBSD v4.11 STABLE (gcc test.c -pthread):
hilo1: puntero contiene 0
hilo1: puntero contiene 0
hilo1: puntero contiene 3
hilo1: puntero contiene 6
hilo1: puntero contiene 9
hilo1: puntero contiene 12
hilo1: puntero contiene 15
hilo1: puntero contiene 18
hilo1: puntero contiene 21
hilo1: puntero contiene 24
finaliza hilo1 con id 134534144
why ??
help me please :-).
--
Concepción, Chile.
More information about the freebsd-hackers
mailing list