<html><head><title>Re: [C con Clase] Problema sincronizacion hilos POSIX</title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">Bueno, no sé de qué va lo que esperas, o lo que tienes agregado en tu <br>
código en sentido general que pueda afectar la integridad del <br>
funcionamiento de los hilos. Repito, no los he revisado porque no sé <br>
ni una gota sobre ellos, pero acabo de testearlo también en Debian con <br>
gcc 4.3.2 y me funciona, o por lo menos lo que tu quieres que haga:<br>
<br>
> <span style=" font-family:'verdana';"><b><u>Solucion deseada:<br>
</u></b><span style=" font-family:'Courier New';">> <br>
> <span style=" font-family:'verdana';">Salidas en pantalla:<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">hilo 1<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">hilo2<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">-- nada durante 3 segundos<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">arriba hilo 1<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">--espera un segundo - diferencial<br>
<span style=" font-family:'Courier New';">> <span style=" font-family:'verdana';">Depierta hilo 2<br>
<span style=" font-family:'Courier New';"><br>
Por si te interesa te adjunto al final, tu codigo modificado.<br>
<br>
<span style=" font-family:'arial'; font-size: 8pt; color: #c0c0c0;"><i>-- <br>
Salu2,<br>
 Gilbert<br>
<br>
<br>
---- begin source code -----<br>
#include <stdio.h><br>
#include <pthread.h><br>
<br>
<br>
#if defined( _WIN32 ) || defined( __WIN32__ )   // windows<br>
#  if defined( MSVC )                           // visual studio c++<br>
#    define mysleep(x) Sleep(x);<br>
#  elif defined ( __GNUC__ )                    // mingw<br>
#    define mysleep(x) _sleep(x * 1000);<br>
#  endif<br>
#else                                           // otro,... en mi caso gcc en linux<br>
#  include <unistd.h><br>
#  define mysleep(x) sleep(x);<br>
#endif<br>
<br>
//#include "procedimientos.h"<br>
//#include "barrier.h"<br>
<br>
int contador = 0;<br>
<br>
typedef struct barrier<br>
  {<br>
    pthread_cond_t complete;<br>
    pthread_mutex_t mutex;<br>
    int count;<br>
    int crossing;<br>
  } barrier_t;<br>
<br>
<br>
struct thdata<br>
  {<br>
    int thread_no[2];<br>
    char message[100];<br>
    barrier_t *barrier;<br>
  };<br>
<br>
<br>
// barrier<br>
void barrier_init(barrier_t *b, int n)<br>
{<br>
  pthread_cond_init(&b->complete, NULL);<br>
  pthread_mutex_init(&b->mutex, NULL);<br>
<br>
  b->count = n;<br>
  b->crossing = 0;<br>
}<br>
<br>
void barrier_cross(barrier_t *b)<br>
{<br>
  pthread_mutex_lock(&b->mutex);<br>
  b->crossing++;<br>
<br>
  if (b->crossing < b->count)<br>
    {<br>
      pthread_cond_wait(&b->complete, &b->mutex);<br>
    }<br>
  else<br>
    {<br>
      pthread_cond_broadcast(&b->complete);<br>
      b->crossing = 0;<br>
    }<br>
<br>
  pthread_mutex_unlock(&b->mutex);<br>
}<br>
<br>
// procedures<br>
void *funcionThread1 (void *ptr)<br>
{<br>
  thdata *data;<br>
   data = (thdata *)ptr; // Datos que mandamos al hilo<br>
<br>
  printf("hilo 1\n");<br>
<br>
  mysleep(3);<br>
<br>
  barrier_cross(data->barrier); // Barrera usada para sincronizacion<br>
<br>
  printf("Arriba hilo 1\n");<br>
  pthread_exit(0);<br>
}<br>
<br>
void *funcionThread2 (void *ptr)<br>
{<br>
  thdata *data;<br>
  data = (thdata *)ptr;<br>
<br>
  printf("hilo 2\n");<br>
  barrier_cross(data->barrier);<br>
<br>
  mysleep(1);<br>
<br>
  printf("Despierta hilo 2\n");<br>
  pthread_exit(0);<br>
}<br>
<br>
<br>
int main()<br>
{<br>
  /* Identificador del thread hijo */<br>
  pthread_t idHilo[2];<br>
  thdata shared_data;<br>
  pthread_attr_t attr;<br>
  barrier_t barrier;<br>
<br>
  /* error devuelto por la función de creación del thread */<br>
  int error[2];<br>
<br>
  shared_data.thread_no[0] = 1;<br>
  shared_data.thread_no[1] = 2;<br>
  shared_data.barrier= &barrier;<br>
<br>
  barrier_init(&barrier, 3);<br>
<br>
  pthread_attr_init(&attr);<br>
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);<br>
<br>
  error[0] = pthread_create (&idHilo[0], NULL, funcionThread1, (void *) &shared_data);<br>
  error[1] = pthread_create (&idHilo[1], NULL, funcionThread2, (void *) &shared_data);<br>
<br>
  /* Comprobamos el error al arrancar el thread */<br>
  if (error[0] != 0)<br>
    {<br>
      printf("No puedo crear thread\n");<br>
      return -1;<br>
    }<br>
<br>
  /* Bucle infinito para incrementar el contador y mostrarlo en pantalla */<br>
  pthread_attr_destroy(&attr);<br>
  barrier_cross(&barrier);<br>
<br>
  pthread_join(idHilo[0], NULL);<br>
  pthread_join(idHilo[1], NULL);<br>
<br>
  return 0;<br>
}<br>
---- end source code -----<br>
</body>