el problema está en lo siguiente:El uso de la variable compartida por 10 pthreads
Quiero escribir un pequeño programa que crea 10 hilos y cada impresiones de una banda de rodadura "id" que se pasa el hilo por la función de puntero.
código completo del programa es el siguiente:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
struct params {
pthread_mutex_t mutex;
int id;
};
typedef struct params params_t;
void* hello(void* arg){
int id;
pthread_mutex_lock(&(*(params_t*)(arg)).mutex);
id = (*(params_t*)(arg)).id;
pthread_mutex_unlock(&(*(params_t*)(arg)).mutex);
printf("Hello from %d\n", id);
}
int main() {
pthread_t threads[10];
params_t params;
pthread_mutex_init (¶ms.mutex , NULL);
int i;
for(i = 0; i < 10; i++) {
params.id = i;
if(pthread_create(&threads[i], NULL, hello, ¶ms));
}
for(i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
La supuesta salida es (no es necesario en este orden):
Hello from 0
....
Hello from 9
resultado real es:
Hello from 2
Hello from 3
Hello from 3
Hello from 4
Hello from 5
Hello from 6
Hello from 8
Hello from 9
Hello from 9
Hello from 9
I intentado colocar mutex en diferentes lugares en la función hello()
, pero no ayudó.
¿Cómo debo implementar la sincronización de subprocesos?
EDIT: Resultado supuesto no es necesario 0 ... 9 puede ser cualquier combinación de estos números, pero cada uno debería aparecer solo una vez.
Incluso con el uso sugerido por usted, el OP puede obtener los mismos resultados que ahora. ¿Me estoy perdiendo de algo? – Jay
@Jay, actualicé el código para mostrar mejor el uso. Pero tienes razón, cada hilo no tiene su propio valor, y el valor que tienen depende cuando llaman a getId() – Brady
@Jay, descubrí una forma mejor de hacerlo sin tener que crear una instancia de params por hilo: solo incrementa la identificación desde el hilo. – Brady