Autor
|
Tema: Semaforos en c (Leído 6,133 veces)
|
prosebas
Desconectado
Mensajes: 17
|
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. #include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <semaphore.h> sem_t semaphore; void *routine(void *routine) { for (int i = 0; i < 3; i++) { sem_wait(&semaphore); printf("%s\n", (char *)routine ); sleep(1); sem_post(&semaphore); } } int main(void) { sem_init(&semaphore, 0, 1); pthread_t thread[3]; pthread_create(&thread[0], NULL, routine, "A"); pthread_create(&thread[1], NULL, routine, "B"); pthread_create(&thread[2], NULL, routine, "C"); for (int i = 0; i < 3; i++) { pthread_join(thread[i], NULL); sleep(1); } }
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
|
|
|
En línea
|
|
|
|
RayR
Desconectado
Mensajes: 243
|
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í: sem_post(&semaphore[(n + 1) % 3 ]);
y para imprimir la letra correcta, algo como:
También deberías llamar a sem_destroy para destruir los semáforos al final.
|
|
|
En línea
|
|
|
|
dijsktra
Desconectado
Mensajes: 110
Mr Edsger Dijsktra (Tribute to)
|
... 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. #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <semaphore.h> #include <unistd.h> // sleep thread. #include <string.h> // memcopy static const char values[3]={'A','B','C'}; static sem_t semaphore[3]; static pthread_t thread[3]; static void *routine(void *arg); int main(int argc, char *args[]) { for (int i = 0; i < 3; i++) if (sem_init(&(semaphore[i]), 0, (i==0)?1:0)) { } for (int i = 0; i < 3; i++) { int *local_idx; if ((local_idx = (int *)malloc(sizeof(int)))==NULL ) { } *local_idx=i; if (pthread_create(&thread[i], NULL, routine, local_idx)) { } } for (int i = 0; i < 3; i++) if (pthread_join(thread[i], NULL)) { } } static void *routine(void *arg) { int local_id; memcpy(&local_id ,arg ,sizeof(int)); for( ; 1 ; ) { if (sem_wait(&semaphore[local_id])) { } printf("%c",values [local_id ]); //sleep(1); if (sem_post(&semaphore[(local_id+1)%3])) { } } }
Ejemplo de salida 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
Mensajes: 243
|
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: 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
Mensajes: 110
Mr Edsger Dijsktra (Tribute to)
|
¿¿¿??? 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
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Hackear semaforos
« 1 2 ... 7 8 »
Hacking
|
sol3r
|
79
|
91,518
|
7 Noviembre 2013, 08:29 am
por matiasnahuelheredia
|
|
|
Semaforos en Windows .. es posible ¡?
PHP
|
DickJunior
|
1
|
4,137
|
2 Diciembre 2009, 02:26 am
por DickJunior
|
|
|
[m][SRC][Semaforos!] Alternativa a CreateMutex
« 1 2 »
Programación Visual Basic
|
Karcrack
|
12
|
7,161
|
17 Marzo 2010, 02:19 am
por Karcrack
|
|
|
Semáforos en C
Programación C/C++
|
masterson
|
3
|
11,684
|
19 Junio 2011, 06:15 am
por CorruptedByte
|
|
|
semáforos, memoria compartida
Programación C/C++
|
javier_cj93
|
1
|
2,088
|
19 Noviembre 2015, 20:08 pm
por javier_cj93
|
|