DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Звіт з лабораторної роботи №2 з дисципліни «Системне програмне забезпечення» на тему «Взаємодія між потоками»

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних технологій, автоматики та метрології
Факультет:
КН
Кафедра:
Кафедра електронних обчислювальних машин

Інформація про роботу

Рік:
2018
Тип роботи:
Лабораторна робота
Предмет:
Системне програмне забезпечення
Група:
КН-31
Варіант:
1 10 13
Коротко про документ

Про що ця робота

У звіті з лабораторної роботи досліджено поняття паралельного виконання потоків та засоби їх синхронізації в ОС Windows. Продемонстровано роботу з критичними секціями, мютексами та семафорами на мові C.

У роботі розглядаються

  • Системне програмне забезпечення
  • Паралельне виконання потоків
  • Синхронізація потоків
  • Критичні ділянки коду
  • Мютекси та семафори в Windows
  • Багатопотоковість на C

Зміст і розділи

  1. Мета роботи
  2. Теоретичні відомості
  3. Варіант завдання/код програми
  4. Результат виконання програми
  5. Висновок
Для кого:Студенти технічних спеціальностей вищих навчальних закладів, що вивчають системне програмне забезпечення.
Викладачі:Жолубак І. М.

Ключові поняття

потіксинхронізаціямютекскритична секціяWindows APIпаралельне виконанняпроцесспільна пам'ять

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» Інститут комп’ютерних технологій, автоматики та метрології Кафедра електронних обчислювальних машин ЗВІТ З лабораторної роботи №2 з дисципліни: «Системне програмне забезпечення» на тему: «Взаємодія між потоками» Варіант №1 Львів – 2018 Мета роботи : Засвоїти поняття паралельного виконання «потоків» та освоїти засоби їх синхронізації. Здобути навики синхронізації «потоків» при обробці спільних даних та доступу до ресурсів в операційній системі Windows. Теоретичні відомості Windows надає чотири об’єкти, призначені для синхронізації потоків і процесів. Три з них — мютекси, семафори і події — є об’єктами ядра, що мають дескриптори. Події використовуються також для інших цілей, наприклад, для асинхронного уведення-виведення. Об’єкт критичної ділянки коду — це ділянка програмного коду, який кожного разу повинен виконуватися тільки одним потоком; паралельне виконання цієї ділянки декількома потоками може приводити до непередбачуваних або невірних результатів. Об’єкт взаємного виключення (mutual exception), або мютекс (mutex), забезпечує більш універсальну функціональність в порівнянні з об’єктом CRITICAL_SECTION. Оскільки мютекси можуть мати імена і дескриптори, їх можна використовувати також для синхронізації потоків, що належать різним процесам. Так, два процеси, що розділяють спільну пам’ять за допомогою відображення файлів, можуть використовувати мютекси для синхронізації доступу до областей пам’яті, що розділяються. Об’єкти другого з трьох згаданих на початку типів об’єктів синхронізації ядра — семафори (semaphores), підтримують лічильники, і коли значення цього лічильника більше 0, об’єкт семафора знаходиться в сигнальному стані. Якщо ж значення лічильника стає нульовим, об’єкт семафора переходить в несигнальний стан. Варіант завдання / Код програми #include <windows.h> #include <stdio.h> #include <process.h> #define THREADCOUNT 2 #define ARRAYSIZE 10 unsigned _stdcall ChangeArray(void *); unsigned _stdcall PrintArray(void *); int array[ARRAYSIZE]; CRITICAL_SECTION critical_sec; HANDLE hSemaphore; HANDLE ghMutex; DWORD WINAPI WriteToDatabase(LPVOID); int main(void) { HANDLE aThread[THREADCOUNT]; InitializeCriticalSection(&critical_sec); unsigned int threadId = 0; for (int i = 0; i < ARRAYSIZE; i++) { array[i] = i + 1; } printf("Critical Section\n"); aThread[0] = (HANDLE)_beginthreadex(NULL, 0, &PrintArray, NULL, 0, &threadId); Sleep(50); aThread[1] = (HANDLE)_beginthreadex(NULL, 0, &ChangeArray, NULL, 0, &threadId); Sleep(50); /*aThread[2] = (HANDLE)_beginthreadex(NULL, 0, &PrintArray, NULL, 0, &threadId); Sleep(100);*/ for (int i = 0; i < THREADCOUNT; i++) CloseHandle(aThread[i]); DeleteCriticalSection(&critical_sec); // Закрити потік //////////////////////////////////////////////////////////// //HANDLE aThread[THREADCOUNT]; printf("Mutex\n"); DWORD ThreadID; int i; // Create a mutex with no initial owner ghMutex = CreateMutex( NULL, // default security attributes FALSE, // initially not owned NULL); // unnamed mutex if (ghMutex == NULL) { printf("CreateMutex error: %d\n", GetLastError()); return 1; } // Create worker threads for (i = 0; i < THREADCOUNT; i++) { aThread[i] = CreateThread( NULL, // default security attributes 0, // default stack size (LPTHREAD_START_ROUTINE)WriteToDatabase, NULL, // no thread function arguments 0, // default creation flags &ThreadID); // receive thread identifier if (aThread[i] == NULL) { printf("CreateThread error: %d\n", GetLastError()); return 1; } } // Wait for all threads to terminate WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE); // Закрити потік for (i = 0; i < THREADCOUNT; i++) CloseHandle(aThread[i]); system("PAUSE"); CloseHandle(ghMutex); return 0; } unsigned _stdcall PrintArray(void *) { EnterCriticalSection(&critical_sec); printf("Thread %d array : ", GetCurrentThreadId()); for (int i = 0; i < ARRAYSIZE; i++) { printf(" %d ", array[i]); } printf("\n"); LeaveCriticalSection(&critical_sec); return 0; } unsigned _stdcall ChangeArray(void *) { EnterCriticalSection(&critical_sec); array[ARRAYSIZE - 1] = 0; printf("Thread %d array changing\n", GetCurrentThreadId()); LeaveCriticalSection(&critical_sec); return 0; } DWORD WINAPI WriteToDatabase(LPVOID lpParam) { // lpParam not used in this example UNREFERENCED_PARAMETER(lpParam); DWORD dwCount = 0, dwWaitResult; // Request ownership of mutex. while (dwCount < 1) { dwWaitResult = WaitForSingleObject( ghMutex, // handle to mutex INFINITE); // no time-out interval switch (dwWaitResult) { // The thread got ownership of the mutex case WAIT_OBJECT_0: __try { // TODO: Write to the database printf("Thread %d writing to database...\n", GetCurrentThreadId()); dwCount++; } __finally { // Release ownership of the mutex object if (!ReleaseMutex(ghMutex)) { // Handle error. } } break; // The thread got ownership of an abandoned mutex // The database is in an indeterminate state case WAIT_ABANDONED: return FALSE; } } return TRUE; } Результат виконання програми / Рис.1. Результат виконання програми Висновок: в даній лабораторній роботі було засвоєно поняття паралельного виконання «потоків» та освоєно засоби їх синхронізації. Здобуто навики синхронізації «потоків» при обробці спільних даних та доступу до ресурсів в операційній системі Windows.
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!