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

os_7

.docx
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
941.23 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего образования

Уфимский Университет Науки и Технологий

Факультет информатики и робототехники

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

Отчет к лабораторной работе №7

По дисциплине «Операционные системы»

По теме «Работа с файлами»

Выполнил: студент группы ПРО-232Б

Ихсанова Э. А.

Проверил: доцент каф. ВМиК

Веденяпин И. Э.

Уфа 2022

Задание

Вариант 7. Написать программу, запускающую два дочерних потока.

Первый поток по выбору пользователя считывает заранее определенный массив из файла или вводится пользователем и записывается в файл, или формируется рандомно (в диапазоне от -250…250) с записью в файл, имя которому задает пользователь. Во втором и третьем случае массив, для дальнейшей работы программы, считывается из вновь сформированного файла. Размерность массива также определяется или пользователем, или рандомно, или задана автором программы. После этого второй поток заменяет на ноль значение элементов (кроме первого и последнего), у которых оба соседних элемента имеют отрицательные значения.

Потоки синхронизировать по выбору пользователя:

  1. В пользовательском режиме

  2. С помощью мьютекса

  3. С помощью семафора

Вывести на экран исходный и результирующий массивы.

Код

#include <iostream>

#include <Windows.h>

#include <time.h>

using namespace std;

LPCTSTR fn = "myFile.dat";

HANDLE myFile;

LONG* mas;

LONG N;

int synchChoice;

int masChoice;

bool Complete = FALSE;

HANDLE hSemaphore;

DWORD n;

int thread01()

{

srand(time(NULL));

if (synchChoice == 1)

{

if (masChoice == 3)

{

for (int i = 0; i < N; ++i)

{

LONG a = -250 + rand() % 500;

InterlockedExchange(&mas[i], a);

WriteFile(myFile, &a, sizeof(a), &n, NULL);

}

}

else if (masChoice == 1)

{

for (LONG i = 0; i < N; ++i) WriteFile(myFile, &i, sizeof(i), &n, NULL);

FlushFileBuffers(myFile);

SetFilePointer(myFile, 0, 0, FILE_BEGIN);

LONG k;

while (ReadFile(myFile, &k, sizeof(k), &n, NULL) && n != 0) mas[N - k - 1] = k;

}

return 0;

}

else if (synchChoice == 2)

{

HANDLE hMutex01 = OpenMutex(SYNCHRONIZE, FALSE, "MyMutex");

if (hMutex01 == NULL)

cout << "Open Mutex01 failed" << GetLastError() << endl;

WaitForSingleObject(hMutex01, INFINITE);

if (masChoice == 3)

{

for (int i = 0; i < N; ++i)

{

int a = -250 + rand() % 500;

mas[i] = a;

WriteFile(myFile, &a, sizeof(a), &n, NULL);

}

}

else if (masChoice == 1)

{

for (LONG i = 0; i < N; ++i) WriteFile(myFile, &i, sizeof(i), &n, NULL);

FlushFileBuffers(myFile);

SetFilePointer(myFile, 0, 0, FILE_BEGIN);

LONG k;

while (ReadFile(myFile, &k, sizeof(k), &n, NULL) && n != 0) mas[N - k - 1] = k;

}

ReleaseMutex(hMutex01);

CloseHandle(hMutex01);

return 0;

}

else if (synchChoice == 3)

{

if (masChoice == 3)

{

for (int i = 0; i < N; ++i)

{

int a = -250 + rand() % 500;

mas[i] = a;

WriteFile(myFile, &a, sizeof(a), &n, NULL);

}

}

else if (masChoice == 1)

{

for (LONG i = 0; i < N; ++i) WriteFile(myFile, &i, sizeof(i), &n, NULL);

FlushFileBuffers(myFile);

SetFilePointer(myFile, 0, 0, FILE_BEGIN);

LONG k;

while (ReadFile(myFile, &k, sizeof(k), &n, NULL) && n != 0) mas[N - k - 1] = k;

}

ReleaseSemaphore(hSemaphore, 1, NULL);

return 0;

}

}

int thread02()

{

if (synchChoice == 1)

{

Sleep(5000);

for (int i = 1; i < n; i++)

{

if (mas[i - 1] < 0 || mas[i + 1] < 0)

{

InterlockedExchange(&mas[N], 0);

}

Complete;

}

return 0;

}

if (synchChoice == 2)

{

HANDLE hMutex02 = OpenMutex(SYNCHRONIZE, FALSE, "MyMutex");

if (hMutex02 == NULL)

cout << "Open Mutex02 failed" << GetLastError() << endl;

WaitForSingleObject(hMutex02, INFINITE);

Sleep(5000);

for (int i = 1; i < n; i++)

{

if (mas[i - 1] < 0 & mas[i + 1] < 0)

{

mas[i] = 0;

}

Complete;

}

ReleaseMutex(hMutex02);

CloseHandle(hMutex02);

return 0;

}

if (synchChoice == 3)

{

Sleep(5000);

WaitForSingleObject(hSemaphore, INFINITE);

for (int i = 1; i < n; i++)

{

if (mas[i - 1] < 0 & mas[i + 1] < 0)

{

mas[i] = 0;

}

Complete;

}

return 0;

}

}

void thread03()

{

while (true)

{

Sleep(1000);

system("cls");

for (int i = 0; i < N; ++i)

{

cout << mas[i] << " ";

}

}

}

void enterFileName()

{

string newPath;

cout << "Введите имя файла (Например, LR_7_7.txt)\n";

cin >> newPath;

char* path = new char[newPath.length() + 1];

newPath.copy(path, newPath.length());

path[newPath.length()] = '\0';

fn = path;

myFile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

}

int main()

{

system("chcp 65001");

enterFileName();

srand(time(NULL));

while (true)

{

cout << "Выберите размера массива:\n1.Заданный заранее\n2.Заданный пользовате-лем\n3.Заданный рандомно\n";

int choice;

cin >> choice;

if (choice == 1)

{

cout << "Размер массива установлен: 5";

N = 5;

Sleep(1000);

break;

}

else if (choice == 2)

{

cout << "Введите размер массива: ";

cin >> N;

break;

}

else if (choice == 3)

{

N = 5 + rand() % 20;

cout << "Размер массива устновлен: " << N << endl;

Sleep(1000);

break;

}

else

{

cout << "ERROR!";

system("pause > nul");

system("cls");

}

}

mas = new LONG[N];

system("cls");

cout << "Как заполнить массив?\n1.Заранее заданные значения\n2.Задать значения вруч-ную\n3.Задать значения рандомно\n";

cin >> masChoice;

if (masChoice == 2)

{

for (int i = 0; i < N; ++i)

{

LONG a;

cin >> a;

mas[i] = a;

WriteFile(myFile, &a, sizeof(a), &n, NULL);

}

}

system("cls");

while (true)

{

cout << "Выберите способ синхронизации:\n1.В пользовательском режиме\n2.С помощью мьютек-са\n3.С помощью семафора\n";

cin >> synchChoice;

if (synchChoice == 1)

{

cout << "Выбран режим пользовательской синхронизации";

Sleep(1000);

break;

}

else if (synchChoice == 2)

{

cout << "Выбран режим синхронизации с помощью мьютекса";

Sleep(1000);

break;

}

else if (synchChoice == 3)

{

cout << "Выбран режим синхронизации с помощью семафора";

Sleep(1000);

break;

}

else

{

cout << "ERROR!";

system("pause > nul");

system("cls");

}

}

system("cls");

HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex");

if (hMutex == NULL)

cout << "Create mutex failed" << GetLastError() << endl;

hSemaphore = CreateSemaphore(NULL, 0, 1, "MySemaphore");

if (hSemaphore == NULL) cout << "Create Semaphore failed" << GetLastError() << endl;

HANDLE hTh01; DWORD IDTh01;

hTh01 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread01, NULL, 0, &IDTh01);

if (hTh01 == NULL) return GetLastError();

HANDLE hTh02; DWORD IDTh02;

hTh02 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread02, NULL, 0, &IDTh02);

if (hTh02 == NULL) return GetLastError();

HANDLE hTh03; DWORD IDTh03;

hTh03 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread03, NULL, 0, &IDTh02);

if (hTh03 == NULL) return GetLastError();

int wait;

cin >> wait;

CloseHandle(hMutex);

CloseHandle(hSemaphore);

CloseHandle(hTh01);

CloseHandle(hTh02);

CloseHandle(hTh03);

CloseHandle(myFile);

DeleteFile(fn);

return 0;

}

Р езультат работы

Соседние файлы в предмете Операционные системы