elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Comunicacion entre hilos. Consumidor-Productor
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Comunicacion entre hilos. Consumidor-Productor  (Leído 1,912 veces)
SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Comunicacion entre hilos. Consumidor-Productor
« en: 2 Octubre 2019, 21:05 pm »

Buenas a todos, encontre un ejemplo del problema de comunicacion en el libro de Tanenbaum que es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #define MAX 100
  4. pthread_mutex_t el_mutex;
  5. pthread_cond_t condc,condp;
  6. int buffer = 0;
  7.  
  8. void *productor(void *ptr){
  9.    int i;
  10.    for(i = 1; i <= MAX;i++){
  11.        pthread_mutex_lock(&el_mutex);
  12.        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);
  13.        printf("Productor....\n");
  14.        buffer = i;
  15.        pthread_cond_signal(&condc);
  16.        pthread_mutex_unlock(&el_mutex);
  17.    }
  18.    pthread_exit(0);
  19. }
  20.  
  21.  
  22. void *consumidor(void *ptr){
  23.    int i;
  24.    for(i = 1; i <= MAX;i++){
  25.        pthread_mutex_lock(&el_mutex);
  26.        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);
  27.        printf("Consumidor....\n");
  28.        buffer = 0;
  29.        pthread_cond_signal(&condp);
  30.        pthread_mutex_unlock(&el_mutex);
  31.    }
  32.    pthread_exit(0);
  33.  
  34. }
  35.  
  36.  
  37. int main(){
  38.    pthread_t pro,con;
  39.    pthread_mutex_init(&el_mutex,0);
  40.    pthread_cond_init(&condc,0);
  41.    pthread_cond_init(&condp,0);
  42.    pthread_create(&con,0,consumidor,0);
  43.    pthread_create(&pro,0,productor,0);
  44.    pthread_join(pro,0);
  45.    pthread_join(con,0);
  46.    pthread_cond_destroy(&condc);
  47.    pthread_cond_destroy(&condp);
  48.    pthread_mutex_destroy(&el_mutex);
  49.    return 0;
  50.  
  51. }
  52.  

Todo va bien hasta aqui.Mi pregunta es si tiene sentido esta dos lineas:
Código
  1.        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);
  2.  

Código
  1.        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);
  2.  

 ¿Es necesario poner la condicion en un while ?. Hasta donde yo entiendo el problema podria ser resuelto sustituyendo el while por un if y lo he verificado en algunas pruebas pero no se si algun detalle se me esta escapando. Creo que el while seria util cuando se tuviera mas de un consumidor o productor pero en este caso en concreto en el cual solo es 1-1 , ¿Tiene sentido?


En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Comunicacion entre hilos. Consumidor-Productor
« Respuesta #1 en: 2 Octubre 2019, 21:47 pm »

Sí, siempre se debe usar un while. Uno, porque el hecho de que en un caso concreto no tengas más threads esperando por el mutex no debería ser razón para no escribir un código que funcionará bien de forma general. Hacer lo correcto en este caso consiste en algo tan simple usar un while, por lo que no se justifica no hacerlo. Otra razón es que es posible que un thread de pronto despierte de forma errónea, aunque la condición no se haya satisfecho realmente. Esta posibilidad ni siquiera se considera necesariamente un bug, pues está contemplada dentro de la especificación de UNIX. Esto es por limitaciones técnicas de ciertos sistemas, me parece. Es muy difícil que en la práctica te vayas a encontrar con un caso así, pero de nuevo, lo correcto es escribir código que (en teoría, al menos) funcione siempre bien.


En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Comunicacion entre hilos. Consumidor-Productor
« Respuesta #2 en: 4 Octubre 2019, 17:53 pm »

Sí, siempre se debe usar un while...[...]
La respuesta de RayR es muy acertada.

Como norma general, hay que poner while. Sólo analizando un caso particular puedes poner if con seguridad, pero tampoco se gana tanto en eficiencia...

Si te lia tu "intuición operacional", (ya que, si es difícil la programación secuencial, la concurrente es inabordable por la explosión de estados) de te recomiendo el siguiente esquema en pseudo lenguaje

Código:
(one thread) 
<await B(var) -> S>

(other thread)
<var = e>
Se traduce en C a lo que refleja el código :
Código:
(one thread)
pthread_Mutex_lock(l)
while !b do pthread_cond_wait(l, c) ;
S
pthread_Mutex_unlock(l)

(other thread)
pthread_Mutex_lock(l)
var=e
pthread_cond_signal(c)
pthread_Mutex_unlock(l)

Por último, antes de manejar variables de condición en C, estudia teoría de monitores en papel y pseudo código! Las variables de condición y mutex asociados no se pueden comprender sin ellos. Fueron creados para implementar esa idea, aunque el lenguaje C no los implementa directamente. java, por ejemplo, si, pero se una forma muy limitada).

la gente las utiliza sin saber su razón de ser
(Perdón por la imprecision, pero estoy escribiendo dese un móvil)
« Última modificación: 4 Octubre 2019, 17:57 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C++]¿Comunicacion entre clases? « 1 2 »
Programación C/C++
skorpion32 14 15,945 Último mensaje 2 Agosto 2011, 01:24 am
por [L]ord [R]NA
Comunicacion entre 2 sockets
Programación C/C++
hayholt 0 2,060 Último mensaje 30 Enero 2012, 09:08 am
por hayholt
Productor-Consumidor Semáforos
Programación C/C++
hardcandy12 0 4,430 Último mensaje 31 Enero 2012, 16:00 pm
por hardcandy12
Problema de semáforos con memoria compartida (Productor-Consumidor)
Programación C/C++
hardcandy12 3 11,800 Último mensaje 10 Febrero 2012, 00:29 am
por Eternal Idol
modelo productor consumidor
Java
Juanma91 0 2,272 Último mensaje 31 Enero 2014, 19:33 pm
por Juanma91
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines