Адміністрація вирішила продати даний сайт. За детальною інформацією звертайтесь за адресою: rozrahu@gmail.com

Взаємодія між потоками

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

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

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

Рік:
2015
Тип роботи:
Лабораторна робота
Предмет:
Системне програмне забезпечення

Частина тексту файла

Міністерство освіти і науки України Національний університет «Львівська політехніка» Кафедра ЕОМ Лабораторна робота №2 з дисципліни: «Системне програмне забезпечення» на тему: «Взаємодія між потоками» Тема: «Взаємодія між потоками» Мета: Засвоїти поняття паралельного виконання «потоків» та освоїти засоби їх синхронізації. Здобути навики синхронізації «потоків» при обробці спільних даних та доступу до ресурсів в операційній системі Windows. Згідно варіанту було розроблено програму в середовищі Visual Studio, що демонструє використання об’єктів синхронізації заданого числа потоків. Системний виклик Варіант   6  Critical Section 3  Mutex 2   Лістинг програми: Використання CriticalSection( ) #include<windows.h> #include<windowsx.h> #include<process.h> #include <time.h> #include<iostream> #include<conio.h> using namespace std; #define DATA_SIZE 256 typedef struct msg_block_tag { /* Message block */ volatile DWORD f_ready, f_stop; /* ready state flag, stop flag */ volatile DWORD sequence; /* Message block sequence number */ volatile DWORD nCons, nLost; //time_t timestamp; CRITICAL_SECTION mguard; /* Guard the message block structure */ DWORD checksum; /* Message contents checksum */ DWORD data[DATA_SIZE]; /* Message Contents */ } MSG_BLOCK; /* One of the following conditions holds for the message block */ /* 1) !f_ready || f_stop */ /* nothing is assured about the data OR */ /* 2) f_ready && data is valid */ /* && checksum and timestamp are valid */ /* Also, at all times, 0 <= nLost + nCons <= sequence */ /* Single message block, ready to fill with a new message */ MSG_BLOCK mblock = { 0, 0, 0, 0, 0 }; static unsigned __stdcall produce (void *); static unsigned __stdcall produce1 (void *); static unsigned __stdcall consume (void *); void MessageFill (MSG_BLOCK *); void MessageDisplay (MSG_BLOCK *); int main () { DWORD Status; UINT ThId; HANDLE produce_h, consume_h, produce1_h; /* Initialize the message block CRITICAL SECTION */ InitializeCriticalSection (&mblock.mguard); /* Create the two threads */ produce_h = (HANDLE)_beginthreadex (NULL, 0, produce, NULL, 0, &ThId); if (produce_h == NULL) cout<<"Cannot create producer thread"<<endl; consume_h = (HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId); if (consume_h == NULL) cout<<"Cannot create consume thread"<<endl; /* Wait for the producer and consumer to complete */ Status = WaitForSingleObject (consume_h, INFINITE); if (Status != WAIT_OBJECT_0) cout<<"Failed waiting for consumer thread"<<endl; Status = WaitForSingleObject (produce_h, INFINITE); if (Status != WAIT_OBJECT_0) cout<<"Failed waiting for produser threads"<<endl; Status = WaitForSingleObject (produce1_h, INFINITE); if (Status != WAIT_OBJECT_0) cout<<"Failed waiting for produser thread#1"<<endl; DeleteCriticalSection (&mblock.mguard); cout<<"Producer and consumer threads have terminated\n"; cout<<"Messages produced: "<<mblock.sequence<<" Consumed: "<<mblock.nCons<<" Known Lost: "<<mblock.nLost<<" "<<endl; _getch(); return 0; } unsigned __stdcall produce (void *arg) /* Producer thread - Create new messages at random intervals */ { srand ((DWORD)time(NULL)); /* Seed the random # generator */ while (!mblock.f_stop) { /* Random Delay */ Sleep(5*1000); /* Get the buffer, fill it */ EnterCriticalSection (&mblock.mguard); __try { if (!mblock.f_stop) { mblock.f_ready = 0; MessageFill (&mblock); mblock.f_ready = 1; mblock.sequence++; } } __finally { LeaveCriticalSection (&mblock.mguard); } } return 0; } unsigned __stdcall produce1 (void *arg) /* Producer thread - Create new messages at random intervals */ { srand ((DWORD)time(NULL)); /* Seed the random # generator */ while (!mblock.f_stop) { /* Random Delay */ Sleep(5*1000); /* Get the buffer, fill it */ EnterCriticalSection (&mblock.mguard); __try { if (!mblock.f_stop) { mbl...
Антиботан аватар за замовчуванням

22.03.2018 19:03

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Завантаження файлу

Якщо Ви маєте на своєму комп'ютері файли, пов'язані з навчанням( розрахункові, лабораторні, практичні, контрольні роботи та інше...), і Вам не шкода ними поділитись - то скористайтесь формою для завантаження файлу, попередньо заархівувавши все в архів .rar або .zip розміром до 100мб, і до нього невдовзі отримають доступ студенти всієї України! Ви отримаєте грошову винагороду в кінці місяця, якщо станете одним з трьох переможців!
Стань активним учасником руху antibotan!
Поділись актуальною інформацією,
і отримай привілеї у користуванні архівом! Детальніше

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

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

пропонує роботу

Admin

26.02.2019 12:38

Привіт усім учасникам нашого порталу! Хороші новини - з‘явилась можливість кожному заробити на своїх знаннях та вміннях. Тепер Ви можете продавати свої роботи на сайті заробляючи кошти, рейтинг і довіру користувачів. Потрібно завантажити роботу, вказати ціну і додати один інформативний скріншот з деякими частинами виконаних завдань. Навіть одна якісна і всім необхідна робота може продатися сотні разів. «Головою заробляти» продуктивніше ніж руками! :-)

Новини