UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

11.2.2. De vuelta a la ejecución no concurrente

Se puede ver la diferencia con una ejecución secuencial de código, realizando unos cambios sobre este. En nuestro ejemplo, si sustituimos la invocación a pthread_create por la llamada a la función thread_run, el código deja de ejecutarse concurrentemente. La siguiente pieza de código muestra esa ejecución no concurrente, sin hilos. Para ello se ha alterado lo menos posible el código de partida; el resultado es este:

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
// compile with $ gcc -Wall -g *.c -pthread -o program
// run with ./program
// check with valgrind --tool=helgrind ./program
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

void* thread_run(void* data)
{ //sleep(2); 
  printf("[TH_1 %ld]: Hello from the thread \n",pthread_self());
  sleep(1);
  (*(int*)data)++;
  printf("[TH_1 %ld]: To exit...............\n",pthread_self());
  //pthread_exit(data);
  return data;
}

int main()
{
  pthread_t thread;
  int data=0;
  int thread_rc=0;
  printf("[MAIN %ld]: Starting............ \n",pthread_self());
  thread_run(&data);
  /*if ((thread_rc=pthread_create(&thread,NULL,thread_run,&data))!=0)
  {
    printf("Error creating the thread. Code %i",thread_rc);
    return -1;
  }*/
  sleep(1);
  printf("[MAIN %ld]: Thread allocated \n",pthread_self());
  int *ptr_output_data;
  //pthread_join(thread,(void **)&ptr_output_data);
  printf("[MAIN %ld]: Thread returns %d \n",pthread_self(),data);
  return 0;
} 

Con ese cambio en la ejecución, independiente de los usos que se hiciesen del sleep, la secuencia resultante de mensajes sería la siguiente:

 ./pthreads_create_join_main_nothreads 
[MAIN:0]: Starting............ 
[MAIN:0]: Thread allocated 
[TH_1:0]: Hello from the thread 
[TH_1:0]: To exit...............
[MAIN:0]: Thread returns 1  

Eso es así debido a que sin hilos, la ventaja de la ejecución concurrente desaparece. En la versión concurrente hay tantas variaciones como diferentes combinaciones existen entre las instruciones de los dos hilos de ejecución, pues ese es el patrón de programación provisto por la plataforma de ejecución.