Advertisement
D_Pain

OS Project 2

Mar 8th, 2018
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.21 KB | None | 0 0
  1. /**
  2.  * Project 2
  3.  * Hyung Jun Hahn
  4.  **/
  5.  
  6. #include <stdio.h>
  7. #include <pthread.h>
  8. #include <stdlib.h>
  9.  
  10. #define NUM_OF_SORTING_THREADS 2
  11.  
  12. int *master_list;
  13. int size;
  14.  
  15. typedef struct {
  16.     int start;
  17.     int end;
  18. } param;
  19.  
  20. void *sorter(void *param); /* the thread */
  21. void *merger(void *param); /* the thread */
  22.  
  23. int main(int argc, char *argv[]) {
  24.     pthread_t tid[NUM_OF_SORTING_THREADS + 1]; // One thread is used for merging.
  25.     pthread_attr_t attr;
  26.     if (argc < 2) {
  27.         printf("Usage: sorter <numbers delimited with space>");
  28.         return -1;
  29.     }
  30.  
  31.     size = argc - 1;
  32.     master_list = malloc(size * sizeof(master_list[0]));
  33.  
  34.     int i;
  35.     for (i = 1; i < argc; i++) {
  36.         char *endptr;
  37.         int val = strtol(argv[i], &endptr, 10);
  38.         master_list[i - 1] = val;
  39.     }
  40.  
  41.     for(i = 0; i < size; i++) {
  42.         printf("Index %d: %d\n", i, master_list[i]);
  43.     }
  44.  
  45.     for (i = 0; i < NUM_OF_SORTING_THREADS; i++) {
  46.         param *data = (param *)malloc(sizeof(param));
  47.         data->start = i * size / 2;
  48.         data->end = (size/ 2 * (i + 1)) - 1;
  49.         pthread_attr_init(&attr);
  50.         pthread_create(&tid[i], &attr, sorter, data);
  51.     }
  52.     for (i = 0; i < NUM_OF_SORTING_THREADS; i++) {
  53.         pthread_join(tid[i], NULL);
  54.         printf("\n");
  55.     }
  56.  
  57.     // Merging lists.
  58.     param *data = (param *)malloc(sizeof(param));
  59.     data->start = 0;
  60.     data->end = size / 2;
  61.     pthread_attr_init(&attr);
  62.     pthread_create(&tid[2], &attr, merger, data);
  63.     pthread_join(tid[2], NULL);
  64.  
  65.     printf("FINAL RESULT: \n");
  66.     while (*master_list) {
  67.         printf("%d ", *master_list++);
  68.     }
  69.     printf("\n");
  70.     return 0;
  71. }
  72.  
  73. void * sorter(void *params) {
  74.     param* data = (param *)params;
  75.     int start = data->start;
  76.     int end = data->end + 1;
  77.     int temp = 0;
  78.     for (int i = start; i< end; i++) {
  79.         for (int j = start; j< end - 1; j++) {
  80.             if (master_list[j] > master_list[j + 1]) {
  81.                 temp = master_list[j];
  82.                 master_list[j] = master_list[j + 1];
  83.                 master_list[j + 1] = temp;
  84.             }
  85.         }
  86.     }
  87.  
  88.     for (int k = start; k < end; k++) {
  89.         printf("Sorted Array: %d\n", master_list[k]);
  90.     }
  91.     pthread_exit(NULL);
  92. }
  93.  
  94. void * merger(void *params) {
  95.     param* data = (param *)params;
  96.     int start1 = data->start;
  97.     int start2 = data->end;
  98.  
  99.     int s1 = data->end;
  100.     int s2 = size - s1;
  101.     int list1[s1], list2[s2];
  102.  
  103.     int i, j;
  104.     for (i = 0; i < s1; i++) {
  105.         list1[i] = master_list[start1 + i];
  106.         printf("list1: %d\n", list1[i]);
  107.     }
  108.     for (j = 0; j < s2; j++) {
  109.         list2[j] = master_list[start2 + j];
  110.         printf("list2: %d\n", list2[j]);
  111.     }
  112.     i = 0;
  113.     j = 0;
  114.     int k = 0;
  115.     while(i < s1 && j < s2) {
  116.         if(list1[i] < list2[j]) {
  117.             master_list[k] = list1[i];
  118.             i++;
  119.         } else {
  120.             master_list[k] = list2[j];
  121.             j++;
  122.         }
  123.         k++;
  124.     }
  125.  
  126.     while(i < s1) {
  127.         master_list[k] = list1[i];
  128.         k++;
  129.         i++;
  130.     }
  131.     while(j < s2) {
  132.         master_list[k] = list2[j];
  133.         k++;
  134.         j++;
  135.     }
  136.     pthread_exit(NULL);
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement