I've spend a lot of time trying to compile this multithrend code, but there is an error with one of the arrays of the void variable, here is the code:
Error is present in this part "seg= pthread_create(&hilos[conteo], NULL , fibonnacci, (void*)data);"
/*
* main.cpp
*
* Created on: 19/05/2017
* Author: smcr
*/
#include <iostream>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
/* estructura para el manejo de datos ---- datosEnvio------
primero = numero 1 de la secuencia de fibonnaci
segudo = numero 2 de la secuencia de fibonnaci
resultado = actual secuencua de fibonacci = (primero + segundo )
idHilo = identificador del numero de hilo
*/
typedef struct {
long primero;
long segundo;
long resultado;
long idHilo;
}datosEnvio;
// ----------------------------------------------------------------------------
//Semáforo para sicronizar los dos hilos
sem_t semaforo;
/*
funcion de hilo ---- fibonnacci ()
parametros:
- datos de tipo datosEnvio;
nota: los parametros deben ser enviados por referencia, para que los cambios se conserven
realiza la suma de las variables para continuar con la secuencia de fibonnaci
imprime la id del hilo, y la continuacion de la secuencia de fibonnaci
*/
void *fibonnacci (void *datos) {
datosEnvio recibido;
recibido = (datosEnvio) datos;
sem_wait(&semaforo);
recibido.resultado = recibido.primero + recibido.segundo;
recibido.primero = recibido.segundo;
recibido.segundo = recibido.resultado;
cout<<"ID Hilo: "<< recibido.idHilo <<". continuacion secuencia # "<< recibido.resultado <<endl;
sem_post(&semaforo);
pthread_exit(NULL);
}
//----------------------------------------------------------------------------------
int main(void) {
/* variables de uso
* conteo: condiacional de bucle centinela para el do while.
* seg = identificador del hilo, para imprimir en caso de error
* hilos [45] : variable vector del tipo pthread_t para el almacenamiento de los 45 hilos.
* data: variable del tipo datosEnvio, enviada como referencia a la funcion de creacion de hilos; iniciadas para el calculo de la secuencia de fibonnaci
*/
int conteo = 0;
int seg;
pthread_t hilos[45]; //= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45};
datosEnvio data;
data.primero = 0;
data.segundo = 1;
data.idHilo = 1;
//--------------------------------------------------------------------------------------------------------------------
//Inicializar el semáforo
sem_init(&semaforo, 1, 1); //Semáforo compartido por los hilos que inicia en 1 (semáforo binario)
/*bucle para la creacion de los 45 hilos
*
*/
do {
seg= pthread_create(&hilos[conteo], NULL , fibonnacci, (void*)data);
data.idHilo++;
if(seg != 0) {
cout<<"Error creating a new thread. Code: "<<seg<<endl;
return -1;
}
conteo++;
}while (conteo < 45);
//-------------------------------------------------------
/*bucle para la impresion de un mensaje de saludo desde el main (plus)
*
*/
for(unsigned char i = 0; i < 45; i++) {
sem_wait(&semaforo); //Intenta tomar el semáforo y si está disponible, continúa
cout<<"saludos desde el main :D hola: "<<(int)i<<endl;
sem_post(&semaforo); //Libera el semáforo
}
pthread_exit(NULL);
return 0;
}
Aucun commentaire:
Enregistrer un commentaire