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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Semaforos en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Semaforos en c  (Leído 6,133 veces)
prosebas

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Semaforos en c
« en: 16 Mayo 2021, 02:03 am »

Hola buenas noches a todos, estoy empezando en el tema de sincronización de procesos a través de semaforos basicamente lo que me piden hacer es que apartir de tres procesos A,B y C tenga como salida ABC ABC ABC utilizando semaforos.

Código
  1. #include <stdlib.h>
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <semaphore.h>
  6. sem_t semaphore;
  7. void *routine(void *routine)
  8. {
  9.     for (int i = 0; i < 3; i++)
  10.     {
  11.          sem_wait(&semaphore);
  12.          printf("%s\n", (char *)routine);
  13.          sleep(1);
  14.          sem_post(&semaphore);
  15.     }
  16. }
  17. int main(void)
  18. {
  19.     sem_init(&semaphore, 0, 1);
  20.     pthread_t thread[3];
  21.     pthread_create(&thread[0], NULL, routine, "A");
  22.     pthread_create(&thread[1], NULL, routine, "B");
  23.     pthread_create(&thread[2], NULL, routine, "C");
  24.     for (int i = 0; i < 3; i++)
  25.     {
  26.          pthread_join(thread[i], NULL);
  27.          sleep(1);
  28.     }
  29. }
  30.  

Esa es la implementación que llevo hasta el momento, sin embargo,la salida me es erronea

Esta es mi salida:
AAA BBB CCC

Les agredezco si me pueden ayudar  ;D


En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Semaforos en c
« Respuesta #1 en: 16 Mayo 2021, 19:57 pm »

Es que así como lo hiciste no hay garantía de ningún orden específico. Y es que ni siquiera es seguro que los hilos se ejecuten en el orden de creación.

No sé si te dieron indicaciones específicas para el ejercicio, pero lo podrías resolver de forma sencilla con tres semáforos. Creas un array de ellos y el primero lo inicializas a 1, y los otros a 0. A cada hilo le podrías enviar como parámetro entero su número de índice. Cada hilo "n" espera por el semáforo n, e incrementa (sem_post) el semáforo n + 1, a excepción del último (2), que incrementará el primero (0). Esto lo podrías hacer así:

Código
  1. sem_post(&semaphore[(n + 1) % 3 ]);

y para imprimir la letra correcta, algo como:

Código
  1. putchar('A' + n);

También deberías llamar a sem_destroy para destruir los semáforos al final.


En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Semaforos en c
« Respuesta #2 en: 25 Junio 2021, 10:22 am »

... A cada hilo le podrías enviar como parámetro entero su número de índice. Cada hilo "n" espera por el semáforo n, e incrementa (sem_post) el semáforo n + 1, a excepción del último (2), que incrementará el primero (0).
El planteamiento es correcto. Pero es importante resaltar el valor inicial de los semáforos. Todos a 0, menos el primero, a 1.

Aqui va una implementación.

Código
  1. #include <pthread.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <semaphore.h>
  5. #include <unistd.h> // sleep thread.
  6. #include <string.h> // memcopy
  7.  
  8. static const char values[3]={'A','B','C'};
  9. static sem_t semaphore[3];
  10. static pthread_t thread[3];
  11.  
  12. static void *routine(void *arg);
  13.  
  14. int main(int argc, char *args[])
  15. {
  16.    for (int i = 0; i < 3; i++)
  17. if (sem_init(&(semaphore[i]), 0, (i==0)?1:0))
  18.    {
  19. perror("sem_init");
  20. exit(-1);
  21.    }
  22.    for (int i = 0; i < 3; i++)
  23. {
  24.    int *local_idx;
  25.    if ((local_idx= (int *)malloc(sizeof(int)))==NULL)
  26. {
  27.    perror("malloc");
  28.    exit(-1);
  29. }
  30.    *local_idx=i;
  31.    if  (pthread_create(&thread[i], NULL, routine, local_idx))
  32.     {
  33.        perror("pthread_create");
  34.        exit(-1);
  35.     }
  36. }
  37.    for (int i = 0; i < 3; i++)
  38.      if (pthread_join(thread[i], NULL))
  39. {
  40.  perror("pthread_join");
  41.  exit(-1);
  42. }
  43. }
  44.  
  45. static void *routine(void *arg)
  46. {
  47.    int local_id;
  48.    memcpy(&local_id,arg,sizeof(int));
  49.    free(arg);
  50.    for( ; 1 ; )
  51. {
  52.    if (sem_wait(&semaphore[local_id]))
  53. {
  54.    perror("sem_wait");
  55.    exit(-1);
  56. }
  57.    printf("%c",values[local_id]);
  58.    //sleep(1);
  59.    if (sem_post(&semaphore[(local_id+1)%3]))
  60. {
  61.    perror("sem_post");
  62.    exit(-1);
  63. }
  64. }
  65. }
  66.  
  67.  

Ejemplo de salida
Código:
ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC...
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)
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Semaforos en c
« Respuesta #3 en: 25 Junio 2021, 15:27 pm »

El planteamiento es correcto. Pero es importante resaltar el valor inicial de los semáforos. Todos a 0, menos el primero, a 1.

¿¿¿??? Pues eso es lo que puse en mi mensaje:

Cita de: RayR
el primero lo inicializas a 1, y los otros a 0. A cada hilo le podrías enviar como parámetro entero su número de índice. Cada hilo "n" espera por el semáforo n, e incrementa (sem_post) el semáforo n + 1, a excepción del último (2), que incrementará el primero (0).
En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Semaforos en c
« Respuesta #4 en: 25 Junio 2021, 17:48 pm »

¿¿¿??? Pues eso es lo que puse en mi mensaje:


Tienes Razon, RayR... Acabe cansado de implementarlo y no lei del todo tu respuesta.
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)
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Semaforos en c
« Respuesta #5 en: 25 Junio 2021, 19:26 pm »

Tienes Razon, RayR... Acabe cansado de implementarlo y no lei del todo tu respuesta.

Bueno, trata de recordarlo para la proxima y no hacer tareas ajenas.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hackear semaforos « 1 2 ... 7 8 »
Hacking
sol3r 79 91,518 Último mensaje 7 Noviembre 2013, 08:29 am
por matiasnahuelheredia
Semaforos en Windows .. es posible ¡?
PHP
DickJunior 1 4,137 Último mensaje 2 Diciembre 2009, 02:26 am
por DickJunior
[m][SRC][Semaforos!] Alternativa a CreateMutex « 1 2 »
Programación Visual Basic
Karcrack 12 7,161 Último mensaje 17 Marzo 2010, 02:19 am
por Karcrack
Semáforos en C
Programación C/C++
masterson 3 11,684 Último mensaje 19 Junio 2011, 06:15 am
por CorruptedByte
semáforos, memoria compartida
Programación C/C++
javier_cj93 1 2,088 Último mensaje 19 Noviembre 2015, 20:08 pm
por javier_cj93
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines