OS
.docxМинистерство образования и науки Украины
Харьковский национальный университет радиоэлектроники
Кафедра ИУС
Контрольная работа по курсу
,, Операционные системы ”
Вариант № 2
Выполнил: студент Проверил:
группы КНз-13-1 проф. С. Ф. Чалый
В. В. Гвоздецкий
12.04.2015
Харьков 2015
Задание: написать многопоточное приложение.
Список исходных файлов:
-
main.cpp
-
get_file.h
-
init.h
-
counter.h
-
article.txt
Файл main.cpp
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include "get_file.h"
#include "counter.h"
int main((int argc,char *argv[])
{
pthread_mutex_init(&mp,NULL);
pthread_create(&main_thread,NULL,get_array,NULL);
sleep(1);//Ждем пока текст не будет в массиве
int w;
for(w=0;w<NUM_OF_THREADS;w++)
{
status=pthread_create(&go_ch[w],NULL,count_ch,(void *)w);
if(status!=0)
perror("Thread not created!");
}
pthread_join(main_thread,NULL);//Запись в массив и его чтение
for(w=0;w<NUM_OF_THREADS;w++)
pthread_join(go_ch[w],NULL); //Дожидаемся подсчета символов в тексте
printf("\n \t ---- Threads complete!!! ----\n");
pthread_mutex_destroy(&mp);
return 0;
}
Файл init.h
#define NUM_OF_THREADS 6
#define len 2084
char *arr = new char[len];//Выделяем память под массив
int s, status, n, k=0;
char ch[7]={'l','i','k','e','p','c','\0'};
pthread_mutex_t mp=PTHREAD_MUTEX_INITIALIZER;
pthread_t go_ch[NUM_OF_THREADS],main_thread;
Файл get_file.h
#include "init.h"
void *get_array(void *)
{
pthread_mutex_lock(&mp);//установка блокировки
FILE* fp = fopen("article.txt", "r");
for(s=0;s<len;s++)
arr[s]=fgetc(fp);//Считываем посимвольно изменяя глобальную переменную
fclose(fp);
printf("\t Read text success!\n\t Loading the text...\n");
sleep(1);//Пауза перед отображением
puts(arr);
pthread_mutex_unlock(&mp);//снятие блокировки
pthread_exit(NULL);
}
Файл counter.h
void *count_ch( void *id)
{
pthread_mutex_lock(&mp);//Захват мьютекса
int idn=(int)id;
for(n=0;n<len;n++)
{
if(arr[n]==ch[idn])
k++;
}
printf("Symbol %c find in text: %d\n",ch[idn],k);
k=0;
pthread_mutex_unlock(&mp);//установка разблокировки мьютекса
pthread_exit(NULL);
}
Результат выполнения