Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab4

.docx
Скачиваний:
14
Добавлен:
02.01.2023
Размер:
34.53 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

Отчет по лабораторной работе №4

по дисциплине «Организация процессов и программирование в среде Linux»

Студент гр.

Преподаватель

Разумовский Г.В.

Тема: Управление потоками

Цель работы: знакомство с организацией потоков и способами синхронизации предков и потомков.

Задание:

Написать программу, которая открывает входной файл и 2 выходных файла. Затем она должна в цикле построчно читать входной файл и порождать 2 потока. Одному потоку передавать нечетную строку, а другому – четную. Оба потока должны работать параллельно. Каждый поток записывает в свой выходной файл полученную строку и завершает работу. Программа должна ожидать завершения работы каждого потока и повторять цикл порождения потоков и чтения строк входного файла, пока не прочтет последнюю строку, после чего закрыть все файлы.

Откомпилировать программу и запустить ее.

Программа main.cpp

#include <iostream>

#include <fstream>

#include <pthread.h>

using namespace std;

ifstream source;

ofstream odd, even;

static void * threadFunctionOdd(void *arg){

    string line = *((string*) arg);

    odd << line << endl;

    pthread_exit(0);

}

static void * threadFunctionEven(void *arg){

    string line = *((string*) arg);

    even << line << endl;

    pthread_exit(0);

}

int main(){

    source.open("text.txt");

    int linesCount = 0;

   

    if(!source.is_open()){

        perror("Не удалось открыть входной файл");

        exit(1);

    }

    source.seekg(0, ios::end);

    if (source.tellg() == 0){

        cout << "Пустой входной файл!\n";

        exit(1);

    }

    source.seekg(0);

    odd.open("odd.txt");

    even.open("even.txt");

    pthread_t thread_1, thread_2;

    pthread_attr_t attr;

    string line1, line2;

    pthread_attr_init(&attr);

    while(true){ //пока не закончится файл

        bool first = true, second = true;

           

        if(getline(source, line1))

            pthread_create(&thread_1, &attr, &threadFunctionOdd, &line1);

        else first = false;

        if(getline(source, line2))

            pthread_create(&thread_2, &attr, &threadFunctionEven, &line2);

        else second = false;

        pthread_join(thread_1, NULL);

        pthread_join(thread_2, NULL);

        if(!(first && second)) {

            break;

        }

    }

    pthread_attr_destroy(&attr);

    source.close();

    odd.close();

    even.close();

    return 0;

}

Входной файл:

1. Is this the real life?

2. Is this just fantasy?

3. Caught in a landside,

4. No escape from reality

5. Open your eyes,

6. Look up to the skies and see,

7. I'm just a poor boy, I need no sympathy,

8. Because I'm easy come, easy go,

9. Little high, little low,

10. Any way the wind blows doesn't really matter to

11. Me, to me

Файл odd.txt:

1. Is this the real life?

3. Caught in a landside,

5. Open your eyes,

7. I'm just a poor boy, I need no sympathy,

9. Little high, little low,

11. Me, to me

Файл even.txt:

2. Is this just fantasy?

4. No escape from reality

6. Look up to the skies and see,

8. Because I'm easy come, easy go,

10. Any way the wind blows doesn't really matter to

Видно, что потоки работают согласовано и не перехватывают ресурсы друг друга. Потоки ожидают друг друга, пока каждый не завершит свою часть работы.

Санкт-Петербург

2022

Соседние файлы в предмете Программирование в среде Linux