lunes, 6 de enero de 2020

Programa en C que genere 6 hilos y estos se identifiquen

Generemos un programa en lenguaje C que lance o genere 6 hilos y estos se identifiquen con un identificador.



#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

#define NUMERO 6

int contador;
static void *saluda (void *);

int main (void)
{
 int i;
 pthread_t hilo[NUMERO];

 for (i = 0; i < NUMERO ; i++) {
  sleep(1);
  pthread_create (&hilo[i],NULL,saluda,NULL);
 }

 for (i = 0; i < NUMERO ; i++) {

  pthread_join (hilo[i],NULL);
 }

 return 0;
}

static void *saluda (void *args) 
{
 contador += 1;
 printf ("Soy el thread %d y tengo el id %d\n",contador,(int) pthread_self());
 return NULL;
}

Memoria compartida, semáforos y procesos

Generar una aplicación multiproceso controlada por un semáforo.


#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>


int main (void)
{
 // 1. Generamos la estructura
 struct sembuf op;

 // 2. Memoria compartida
 int id_mem;
 int *var;
 if ((id_mem = shmget(IPC_PRIVATE,sizeof(int), IPC_CREAT | 0600)) == -1){
  perror("shmget");
  exit(1);
 }

 var = shmat(id_mem,0,0);
 (*var) = 0;

 // 3. Generación del semáforo
 int id_sem;
 if ((id_sem = semget(IPC_PRIVATE,1,0777)) == -1) {
  perror("semget");
  exit(1);
 }

 // 4. Inicialización del semáforo
 semctl(id_sem,0,SETVAL,1);
 op.sem_num = 0;
 op.sem_flg = 0;

 // 5. Lanzamos los procesos fork()
 fork(); fork(); fork(); 

 // 6. Pasamos los procesos por el semáforo
 for (int i = 0; i < 10 ; i++) {
  op.sem_op = -1;
  semop(id_sem,&op,1);
  (*var)++;
  printf ("El valor de var: %d \n",*var);
  op.sem_op = 1;
  semop(id_sem,&op,1);
 }

 // 7. Eliminamos la memoria compartida así como el semáforo
 semctl(id_sem,0,IPC_RMID);
 shmdt(var);
 shmctl(id_mem,IPC_RMID,0);

 return 0;
}