ЛЕБЕДКО ЛАБ / Лабка 6
.docОтчет ЛЕБЕДКО И.А.
ЗФ ИСиТ 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.