Advertisement
STANAANDREY

cnt lowers where each pthread has cnt

Dec 8th, 2024 (edited)
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.68 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.  
  14. typedef struct {  
  15.     char *str; // Portion of the file assigned to the thread  
  16.     int cnt;   // Count of lowercase letters in this portion  
  17. } ThArg;  
  18.  
  19. off_t getFileSize(const char fpath[]) {  
  20.     struct stat statBuf;  
  21.     if (stat(fpath, &statBuf)) {  
  22.         perror("stat");  
  23.         exit(1);  
  24.     }  
  25.     return statBuf.st_size;  
  26. }  
  27.  
  28. void *routine(void *arg) {  
  29.     ThArg *thArg = (ThArg *)arg;  
  30.  
  31.     // Count lowercase letters in the assigned portion  
  32.     for (int i = 0; thArg->str[i]; i++) {  
  33.         if (islower(thArg->str[i])) {  
  34.             thArg->cnt++;  
  35.         }  
  36.     }  
  37.  
  38.     // Free the allocated memory for the string  
  39.     free(thArg->str);  
  40.     thArg->str = NULL;  
  41.     return NULL;  
  42. }  
  43.  
  44. void *zalloc(int nmemb, int size) {  
  45.     void *p = calloc(nmemb, size);  
  46.     if (!p) {  
  47.         perror("calloc");  
  48.         exit(1);  
  49.     }  
  50.     return p;  
  51. }  
  52.  
  53. int main(int argc, char *argv[]) {  
  54.     if (argc != 3) {  
  55.         fprintf(stderr, "Usage: %s <file_name> <num_threads>\n", argv[0]);  
  56.         exit(1);  
  57.     }  
  58.  
  59.     N_THREADS = atoi(argv[2]);  
  60.     if (N_THREADS <= 0) {  
  61.         fprintf(stderr, "Number of threads must be greater than 0.\n");  
  62.         exit(1);  
  63.     }  
  64.  
  65.     // Get file size  
  66.     int fsize = getFileSize(argv[1]);  
  67.     if (fsize == 0) {  
  68.         fprintf(stderr, "File is empty.\n");  
  69.         exit(1);  
  70.     }  
  71.  
  72.     // Open the file  
  73.     int fd = open(argv[1], O_RDONLY);  
  74.     if (fd == -1) {  
  75.         perror("open");  
  76.         exit(1);  
  77.     }  
  78.  
  79.     // Allocate memory for thread arguments  
  80.     ThArg *thArgs = (ThArg *)zalloc(N_THREADS, sizeof(ThArg));  
  81.     pthread_t threads[N_THREADS];  
  82.  
  83.     // Calculate the number of bytes each thread will process  
  84.     int bytesPerTh = fsize / N_THREADS;  
  85.  
  86.     for (int i = 0; i < N_THREADS; i++) {  
  87.         // Allocate memory for the thread's portion of the file  
  88.         int start = i * bytesPerTh;  
  89.         int end = (i == N_THREADS - 1) ? fsize : (i + 1) * bytesPerTh;  
  90.         int chunkSize = end - start;  
  91.  
  92.         thArgs[i].str = (char *)zalloc(chunkSize + 1, sizeof(char));  
  93.         thArgs[i].cnt = 0;  
  94.  
  95.         // Read the thread's portion of the file  
  96.         if (lseek(fd, start, SEEK_SET) == -1) {  
  97.             perror("lseek");  
  98.             free(thArgs[i].str);  
  99.             free(thArgs);  
  100.             close(fd);  
  101.             exit(1);  
  102.         }  
  103.         if (read(fd, thArgs[i].str, chunkSize) != chunkSize) {  
  104.             perror("read");  
  105.             free(thArgs[i].str);  
  106.             free(thArgs);  
  107.             close(fd);  
  108.             exit(1);  
  109.         }  
  110.         thArgs[i].str[chunkSize] = '\0'; // Null-terminate the string  
  111.  
  112.         // Create the thread  
  113.         if (pthread_create(&threads[i], NULL, routine, &thArgs[i]) != 0) {  
  114.             perror("pthread_create");  
  115.             free(thArgs[i].str);  
  116.             free(thArgs);  
  117.             close(fd);  
  118.             exit(1);  
  119.         }  
  120.     }  
  121.  
  122.     // Join threads  
  123.     for (int i = 0; i < N_THREADS; i++) {  
  124.         pthread_join(threads[i], NULL);  
  125.     }  
  126.  
  127.     // Sum up the results  
  128.     int total_lowercase = 0;  
  129.     for (int i = 0; i < N_THREADS; i++) {  
  130.         total_lowercase += thArgs[i].cnt;  
  131.     }  
  132.  
  133.     printf("Total lowercase letters: %d\n", total_lowercase);  
  134.  
  135.     // Clean up  
  136.     free(thArgs);  
  137.     close(fd);  
  138.  
  139.     return 0;  
  140. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement