Advertisement
STANAANDREY

cnt lowers with array & pthreads

Dec 8th, 2024
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.23 KB | None | 0 0
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <pthread.h>  
  4. #include <stdint.h>  
  5. #include <unistd.h>  
  6. #include <sys/types.h>  
  7. #include <sys/stat.h>  
  8. #include <fcntl.h>  
  9. #include <ctype.h>  
  10. #include <string.h>  
  11.  
  12. static int N_THREADS;  
  13. static int *arrCnt;  
  14.  
  15. off_t getFileSize(const char fpath[]) {  
  16.     struct stat statBuf;  
  17.     if (stat(fpath, &statBuf)) {  
  18.         perror("stat");  
  19.         exit(1);  
  20.     }  
  21.     return statBuf.st_size;  
  22. }  
  23.  
  24. typedef struct {  
  25.     int thread_id;  
  26.     int start;  
  27.     int end;  
  28.     char *file_content;  
  29. } ThreadData;  
  30.  
  31. void *routine(void *arg) {  
  32.     ThreadData *data = (ThreadData *)arg;  
  33.     int cnt = 0;  
  34.  
  35.     for (int i = data->start; i < data->end; i++) {  
  36.         if (islower(data->file_content[i])) {  
  37.             cnt++;  
  38.         }  
  39.     }  
  40.  
  41.     arrCnt[data->thread_id] = cnt;  
  42.     return NULL;  
  43. }  
  44.  
  45. void *zalloc(int nmemb, int size) {  
  46.     void *p = calloc(nmemb, size);  
  47.     if (!p) {  
  48.         perror("calloc");  
  49.         exit(1);  
  50.     }  
  51.     return p;  
  52. }  
  53.  
  54. int main(int argc, char *argv[]) {  
  55.     if (argc != 3) {  
  56.         fprintf(stderr, "Usage: %s <file_name> <num_threads>\n", argv[0]);  
  57.         exit(1);  
  58.     }  
  59.  
  60.     N_THREADS = atoi(argv[2]);  
  61.     if (N_THREADS <= 0) {  
  62.         fprintf(stderr, "Number of threads must be greater than 0.\n");  
  63.         exit(1);  
  64.     }  
  65.  
  66.     // Get file size  
  67.     int fsize = getFileSize(argv[1]);  
  68.     if (fsize == 0) {  
  69.         fprintf(stderr, "File is empty.\n");  
  70.         exit(1);  
  71.     }  
  72.  
  73.     // Open the file  
  74.     int fd = open(argv[1], O_RDONLY);  
  75.     if (fd == -1) {  
  76.         perror("open");  
  77.         exit(1);  
  78.     }  
  79.  
  80.     // Read the entire file into memory  
  81.     char *file_content = zalloc(fsize + 1, sizeof(char));  
  82.     if (read(fd, file_content, fsize) != fsize) {  
  83.         perror("read");  
  84.         free(file_content);  
  85.         close(fd);  
  86.         exit(1);  
  87.     }  
  88.     file_content[fsize] = '\0'; // Null-terminate the file content  
  89.  
  90.     close(fd);  
  91.  
  92.     // Allocate memory for thread results  
  93.     arrCnt = zalloc(N_THREADS, sizeof(*arrCnt));  
  94.  
  95.     // Create threads  
  96.     pthread_t threads[N_THREADS];  
  97.     ThreadData thread_data[N_THREADS];  
  98.  
  99.     int bytesPerTh = fsize / N_THREADS;  
  100.     for (int i = 0; i < N_THREADS; i++) {  
  101.         thread_data[i].thread_id = i;  
  102.         thread_data[i].start = i * bytesPerTh;  
  103.         thread_data[i].end = (i == N_THREADS - 1) ? fsize : (i + 1) * bytesPerTh;  
  104.         thread_data[i].file_content = file_content;  
  105.  
  106.         if (pthread_create(&threads[i], NULL, routine, &thread_data[i]) != 0) {  
  107.             perror("pthread_create");  
  108.             free(file_content);  
  109.             free(arrCnt);  
  110.             exit(1);  
  111.         }  
  112.     }  
  113.  
  114.     // Join threads  
  115.     for (int i = 0; i < N_THREADS; i++) {  
  116.         pthread_join(threads[i], NULL);  
  117.     }  
  118.  
  119.     // Sum up the results  
  120.     int total_lowercase = 0;  
  121.     for (int i = 0; i < N_THREADS; i++) {  
  122.         total_lowercase += arrCnt[i];  
  123.     }  
  124.  
  125.     printf("Total lowercase letters: %d\n", total_lowercase);  
  126.  
  127.     // Clean up  
  128.     free(file_content);  
  129.     free(arrCnt);  
  130.  
  131.     return 0;  
  132. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement