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

ЛЕБЕДКО ЛАБ / Лабка 6

.doc
Скачиваний:
13
Добавлен:
26.03.2015
Размер:
54.27 Кб
Скачать

Отчет ЛЕБЕДКО И.А.

ЗФ ИСиТ 3 курс

Лабораторная работа №6

Задание 1. Изменение приоритета потока.

voidSetPrioritetStream()

{ int z=5;

unsignedintmyCounter=0;

DWORD myThreadID;

HANDLE myHandle = CreateThread(0, 0, myThread1, (void*)&z, 0, &myThreadID);

intCurPr = GetPriorityClass(GetCurrentProcess());

int iPriority1 = GetThreadPriority(myHandle);

printf("\n Priority is: %d",iPriority1);

SetThreadPriority(myHandle,THREAD_PRIORITY_ABOVE_NORMAL);

iPriority1 = GetThreadPriority(myHandle);

printf("\n After Change Priority is: %d",iPriority1);

SetThreadPriority (myHandle,THREAD_PRIORITY_HIGHEST);

iPriority1 = GetThreadPriority(myHandle);

printf("\nThe Highest Priority is: %d",iPriority1);

SetThreadPriority(myHandle,THREAD_PRIORITY_LOWEST);

iPriority1 = GetThreadPriority(myHandle);

printf("\nThe Lowest Priority is: %d",iPriority1);

Sleep(5000);

printf("\n Main Process sagt Das istAlles\n");

TerminateThread(myHandle,0);

}

Здесь создается поток, выполняющий функцию:

DWORD WINAPI myThread1(void* lpParameter)

{ int* counterp= newint();

counterp=(int*) lpParameter;

int counter=*counterp;

while(counter<20)

{ Sleep(500);

counter++;

printf("\n Counter= %d",counter);

}

return 0;

}

Функция-счетчик идентична с функцией из предыдущей лабораторной. Собственно как и сама функция инициализации потока. Но здесь используется некоторые дополнительные функции: GetPriorityClass, определяющая приоритет процесса, в нашем случае – текущего, и функции определения и переопределения приоритета потока соответственно: GetThreadPriority и SetThreadPriority.

Задание 2. При помощи потока открыть файл и изменить его содержимое.

DWORD WINAPI myThread2(void* lpParameter)

{ TCHAR Buffer [256]=TEXT("HELLO!");

HANDLE hOut;

DWORD dwBytes, dwBytes2;

TCHAR stdPath[40]=TEXT("H:\\Новаяпапка\\OC\\L6\\L6\\file.txt");

hOut=CreateFile(stdPath,GENERIC_WRITE | GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hOut==INVALID_HANDLE_VALUE)

{ printf("File not open\n");

return 2;

}

else

{ WriteFile(hOut,Buffer,256,&dwBytes,NULL);

CloseHandle(hOut);

char b[256];

hOut=CreateFile(stdPath,GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

ReadFile(hOut,b,sizeof(Buffer),&dwBytes,NULL);

int i=0;

while(i<20)

{ std::cout<<b[i];

i++;

}

std::cout<<std::endl;

printf("File Written\n");

}

return 0;

}

voidWriteFileInStream()

{ int z=0;

DWORD myThreadID;

HANDLE myHandle = CreateThread(0, 0, myThread2, (void*)&z, CREATE_SUSPENDED, &myThreadID);

BOOL b= SetThreadPriorityBoost(myHandle, false);

if (b) SetThreadPriority(myHandle,THREAD_PRIORITY_HIGHEST);

ResumeThread(myHandle);

Sleep(2000);

printf("\n Main Process sagt Das istAlles\n");

TerminateThread(myHandle,0);

}

Потоки и функции работы с файлами

Задание 3. С передачей параметра.

{ рабочий код }

Задание 4. С функцией ожидания конца процесса.

WaitForSingleObject(myHandle,10000);

Первый параметр-хэндл потока, завершения работы которого мы ждем, второй – максимальное время ожидания.

Задание 5. Механизма критических зон

DWORD WINAPI myThread4(void* lpPar)

{ TCHAR* b= newTCHAR();

b=(TCHAR*) lpPar;

HANDLE hOut;

DWORD dwBytes;

TCHAR stdPath[40]=TEXT("H:\\Новаяпапка\\OC\\L6\\L6\\file.txt");

EnterCriticalSection(&cs );

hOut=CreateFile(stdPath,GENERIC_WRITE,0,NULL,

CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hOut==INVALID_HANDLE_VALUE)

{ printf("ERROR WRITING FILE");

return 2;

}

else

{ WriteFile(hOut,b,256,&dwBytes,NULL);

printf("Thread Written\n");

CloseHandle(hOut);

}

LeaveCriticalSection( &cs );

return 0;

}

voidAllThatWasAndCriticalSection()

{ int z=0;

DWORD myThreadID;

TCHAR Buff [256]=TEXT("HELLO! Students 2");

InitializeCriticalSection(&cs );

HANDLE myHandle = CreateThread(0, 0, myThread4, (void*)Buff, CREATE_SUSPENDED, &myThreadID);

BOOL b= SetThreadPriorityBoost(myHandle, false);

if (b) SetThreadPriority(myHandle,THREAD_PRIORITY_HIGHEST);

ResumeThread(myHandle);

WaitForSingleObject(myHandle,10000);

printf("\n Main Process sagt Das istAlles\n");

TerminateThread(myHandle,0);

}

Критические секции и семафоры – механизм предотвращения “тупиков”, позволяющий избежать ошибок при запросах на использование некоторых общих ресурсов. Критические секции представляют собой некие “зоны риска”, в которых происходит использование общего ресурса. Вход-выход из этих зон осуществляется посредством команд EnterCriticalSection и LeaveCriticalSection. Когда процесс входит в критическую зону, специальная глобальная булева переменная, так называемая семафора, принимает положительное значение и запрещает доступ к этому ресурсу для всех иных запросов.

Задание 6. Два потока:

DWORD WINAPI myThread5(void* lpPar)

{ TCHAR* b= newTCHAR();

b=(TCHAR*) lpPar;

HANDLE hOut;

DWORD dwBytes;

TCHAR stdPath[40]=TEXT("H:\\Новаяпапка\\OC\\L6\\L6\\file.txt");

EnterCriticalSection(&cs );

hOut=CreateFile(stdPath,GENERIC_WRITE,0,NULL,

CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hOut==INVALID_HANDLE_VALUE)

{ printf("ERROR WRITING FILE\n");

return 2;

}

else

{ WriteFile(hOut,b,256,&dwBytes,NULL);

printf("Thread 2 Written\n");

CloseHandle(hOut);

}

LeaveCriticalSection(&cs );

return 0;

}

voidTwoTimesAllThatWere()

{ int z=0;

DWORD myThreadID;

DWORD myThreadID2;

TCHAR Buff [256]=TEXT("HELLO! Students 2");

TCHAR Buff2 [256]=TEXT("Gut Abend Liber Kollegen");

InitializeCriticalSection(&cs );

HANDLE myHandle = CreateThread(0, 0, myThread4, (void*)Buff, CREATE_SUSPENDED, &myThreadID);

BOOL b= SetThreadPriorityBoost(myHandle, false);

if (b) SetThreadPriority(myHandle,THREAD_PRIORITY_HIGHEST);

HANDLE myHandle2 = CreateThread(0, 0, myThread5, (void*)Buff2, CREATE_SUSPENDED, &myThreadID2);

ResumeThread(myHandle);

ResumeThread(myHandle2);

WaitForSingleObject(myHandle,10000);

WaitForSingleObject(myHandle2,10000);

printf("\n Main Process sagt Das istAlles\n");

TerminateThread(myHandle,0);

TerminateThread(myHandle2,0);

}

Тут мы производим синхронизацию работы двух потоков с общим файлом-ресурсом.

Задание 7.Создание синхронизированных потока-писателя в файл и потока-читателя из того же файла.

DWORD WINAPI StreamWriter(void* lpPar)

{ int count=1230;

char *b=newchar[4];

while(count<1240)

{ itoa(count,b,10);

HANDLE hOut;

DWORD dwBytes;

TCHAR stdPath[40]=TEXT("H:\\Новаяпапка\\OC\\L6\\L6\\file.txt");

EnterCriticalSection(&cs );

hOut=CreateFile(stdPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hOut==INVALID_HANDLE_VALUE)

{ printf("ERROR WRITING FILE\n");

return 2;

}

else

{ WriteFile(hOut,b,sizeof(b),&dwBytes,NULL);

printf("ThreadWritten\n");

CloseHandle(hOut);

}

LeaveCriticalSection(&cs );

count++;

Sleep(100);

}

return 0;

}

DWORD WINAPI StreamReader(void* lpPar)

{ HANDLE hOut;

for(int j=0; j<10; j++)

{ DWORD dwBytes;

TCHAR stdPath[40]=TEXT("H:\\Новаяпапка\\OC\\L6\\L6\\file.txt");

EnterCriticalSection(&cs );

hOut=CreateFile(stdPath,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hOut==INVALID_HANDLE_VALUE)

{ printf("ERROR WRITING FILE-2\n");

return 2;

}

else

{ char b[4];

ReadFile(hOut,b,4,&dwBytes,NULL);

int i=0;

while(i<4)

{ std::cout<<b[i];

i++;

} std::cout<<std::endl;

printf("File readet\n");

CloseHandle(hOut);

}

LeaveCriticalSection(&cs );

Sleep(100);

}

return 0;

}

voidMyLittleProgramm()

{ DWORD myThreadID;

DWORD myThreadID2;

InitializeCriticalSection(&cs );

HANDLE myHandle = CreateThread(0, 0, StreamWriter, NULL, CREATE_SUSPENDED, &myThreadID);

HANDLE myHandle2 = CreateThread(0, 0, StreamReader, NULL, CREATE_SUSPENDED, &myThreadID2);

ResumeThread(myHandle);

Sleep(100);

ResumeThread(myHandle2);

WaitForSingleObject(myHandle,20000);

WaitForSingleObject(myHandle2,20000);

printf("\n End:3\n");

TerminateThread(myHandle,0);

TerminateThread(myHandle2,0);

}

Функция ReadFile.

Соседние файлы в папке ЛЕБЕДКО ЛАБ