C program. NOT C++
specialcountmulthreads.c is not completed. Need some modification
31 text files named input_00.txt to input_30.txt.
Requirements:
Multiple threads are expected to run in parallel to share the workload, i.e. suppose 3 threads to process 30 files totally, then each thread should process 10 files;
When a thread is created, a message should be print out showing which files this thread will process, for example:
Thread id = 274237184 starts processing files with index from 0 to 10!
When a file is being processed, a message should be print out showing which thread (thread_id = xxx) is processing this file, for example:
Thread id = 265844480 is processing file input_11.txt
When a thread is done with its workload, a message should be print out showing which files this thread has done with work, for example:
Thread id = 274237184 is done !
The array long specialfreq[ ] should always be up-to-date, i.e. it always has the result of all the threads counted so far. [You may need to use mutexes to protect this critical region.]
======specialcountmulthreads.c=====================
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#define MAX_FILES 30
#define MAX_LEN 1000
int num_threads;
char *filename[MAX_FILES];
int num_files;
long specialfreq[MAX_FILES];
int *index_array[MAX_FILES];
void *thread_function(void *arg) {
int *index = (int *) arg;
int i;
int my_index = *index;
int starting_index = my_index * (num_files / num_threads);
int ending_index = starting_index + (num_files / num_threads);
FILE *fp;
char ch;
int count = 0;
char line[MAX_LEN];
printf(“Thread ID: %lu starts working on files %d to %d.\n”, pthread_self(), starting_index, ending_index);
for (i = starting_index; i < ending_index; i++) {
fp = fopen(filename[i], “r”);
if (fp == NULL) {
perror(“Error opening file”);
} else {
printf(“Thread ID: %lu is working on file %s\n”, pthread_self(), filename[i]);
while (fgets(line, sizeof (line), fp) != NULL) {
ch = fgetc(fp);
if (ch == ‘!’) {
count++;
}
}
specialfreq[i] = count;
fclose(fp);
}
}
printf(“Thread ID: %lu is done!\n”, pthread_self());
pthread_exit(NULL);
}
void specialcountmulthreads(char *path, char *filetowrite, long specialfreq[], int num_threads) {
pthread_t tid;
int i;
int err;
int total_count = 0;
if (argc < 3) {
printf(“Usage: ./a.out num_threads input_file1 input_file2 … input_file30”);
exit(0);
}
num_threads = atoi(argv[1]);
num_files = argc – 2;
//printf(“Num thread: %d\n”, num_threads);
//printf(“Num files: %d\n”, num_files);
for (i = 2; i < argc; i++) {
filename[i – 2] = argv[i];
//printf(“Argv: %s\n”, argv[i]);
//printf(“Filename: %s\n”, filename[i – 2]);
}
for (i = 0; i < num_files; i++) {
index_array[i] = malloc(sizeof (int));
*index_array[i] = i;
//printf(“Index array: %d\n”, *index_array[i]);
//printf(“Index array: %d\n”, index_array[i]);
}
for (i = 0; i < num_threads; i++) {
err = pthread_create(&tid, NULL, thread_function, index_array[i]);
if (err != 0) {
printf(“\ncan’t create thread :[%s]”, strerror(err));
}
}
for (i = 0; i < num_files; i++) {
total_count += specialfreq[i];
}
printf(“Total count: %d\n”, total_count);
return 0;
}
======================testmulthreads.c=====================================================
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include<unistd.h>
#include <stdbool.h>
#include “count.h”
/*
* Print the frequencies of special words stored in array: specialfreq[] to output screen in the format as:
* letter -> frequency (one letter a line)
* Input: specialfreq – array having the frequency of each special word
size – the total number of special words
* example:
* he -> 250932
* she -> 181764
*/
void displayalphabetfreq(long specialfreq[], int size)
{
for(int i = 0; i < size; i++)
{
switch (i)
{
case 0:
printf(“%s -> %d\n”, “he”, specialfreq[i]);
break;
case 1:
printf(“%s -> %d\n”, “she”, specialfreq[i]);
break;
case 2:
printf(“%s -> %d\n”, “they”, specialfreq[i]);
break;
case 3:
printf(“%s -> %d\n”, “him”, specialfreq[i]);
break;
case 4:
printf(“%s -> %d\n”, “me”, specialfreq[i]);
break;
defalut:
printf(“%s”, “Wrong number of special words … “);
}
}
}
int main(int argc, char *argv[])
{
printf(“Please enter 2 arguments only eg.\”./testmulthreads #_of__threads!!\”\n”);
int num_threads = atoi(argv[1]);
char *path = “../data”; // the data *.txt files are under this folder
char *filetowrite = “../result/result.txt”; // the frequency of all alphabetical letters will be written in this file
long specialfreq[SPECIALSIZE] = {0}; // array to store the frequency of each alphablet letter, which should be alway up-to-date;
specialcountmulthreads(path, filetowrite, specialfreq, num_threads); // process the data files using mutiple threads
printf(“The results are counted as follows : \n”);
displayalphabetfreq(specialfreq, SPECIALSIZE); // print the frequency stored in the array to output screen
}