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