Savelyev_Vyacheslav

OS_laba4_SemeforBufer

May 15th, 2021 (edited)
364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.00 KB | None | 0 0
  1. // SemBuf_14.05.2021.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4.  
  5.  
  6. #define _CRT_SECURE_NO_WARNINGS
  7. #include <iostream>
  8. #include <thread>
  9. #include <ctime>
  10. #include <cstdlib>
  11.  
  12. #include <windows.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <random>
  16.  
  17. using namespace std;
  18.  
  19.  
  20.  
  21. class Bu
  22. {
  23.     // первая фенкция содает ряд натуральных чисел
  24. public:
  25.     int j;
  26.  
  27.     HANDLE semT1 = semT1F();
  28.  
  29.     HANDLE semT1F() {
  30.         semT1 = CreateSemaphore(NULL, 1, 1, L"MySemaphoreNameT1");
  31.         return semT1;
  32.         CloseHandle(semT1);
  33.     }
  34.  
  35.     void  massivPP()
  36.     {
  37.         j++;
  38.         if (j == 451) { system("pause"); exit(1); }
  39.     }
  40.  
  41.  
  42.  
  43.     // вторая функция печатает число из массива
  44. public:
  45.     int print;
  46.     HANDLE semT2 = semT2F();
  47.     HANDLE semT2F() {
  48.         semT2 = CreateSemaphore(NULL, 1, 1, L"MySemaphoreNameT2");
  49.         return semT2;
  50.         CloseHandle(semT2);
  51.     }
  52.  
  53.     void  PrintOne()
  54.     {
  55.         cout << print << " massiv ---------- \n";
  56.     }
  57.  
  58.  
  59.  
  60.     // функция буфера принимает элемент для записи
  61. public:
  62.     HANDLE semBu;
  63.     const int size9 = 9;
  64.     int* bufer = new int[size9];
  65.     int steps;
  66.     int added;
  67.  
  68.     HANDLE semTBU() {
  69.         semBu = CreateSemaphore(NULL, 9, 9, L"MySemaphoreNameBu");
  70.         return semBu;
  71.     }
  72.  
  73.     void  add()
  74.     {
  75.         if (0 == steps % 9) {
  76.             ReleaseSemaphore(semBu, 9, NULL); // обнуление буфера освобождение
  77.         }
  78.         bufer[steps % 9] = added;
  79.         cout << "   " << bufer[steps % 9] << " massiv ++++++++++\n";
  80.         steps++;
  81.         WaitForSingleObject(semBu, INFINITE); // счетчик максимально заполнение буфера
  82.     }
  83.  
  84.     void printALL() { // печать проверка
  85.         int i = 0;
  86.         while (i < size9) {
  87.             cout << "bufer [" << i << "] " << bufer[i] << endl;
  88.             i++;
  89.         }
  90.     }
  91.  
  92. private:
  93. };
  94.  
  95.  
  96. Bu bu;
  97.  
  98. void Thread1F(Bu& bu) {  //добавляем в буфер
  99.  
  100.     Sleep(1000);
  101.     int i = 0;
  102.     //Sleep(500);
  103.     while (1) {
  104.         bu.massivPP(); // увеличиваем массив
  105.         bu.added = bu.j; bu.add();     // добавляем в буфер
  106.     WaitForSingleObject(bu.semT2, INFINITE); // блокировка ввода
  107.     ReleaseSemaphore(bu.semT1, 1, NULL); //разрешение печати
  108.         i++;
  109.     }
  110.  
  111. }
  112.  
  113. void Thread2F(Bu& bu) {// печатаем из буфера
  114.  
  115.     Sleep(1000);
  116.     int i = 0;
  117.    
  118.     while (1) {
  119.         bu.print = bu.added; // печатаем
  120.         bu.PrintOne();
  121.     WaitForSingleObject(bu.semT1, INFINITE); // блокировка печати
  122.     ReleaseSemaphore(bu.semT2, 1, NULL); //разрешение ввода
  123.         i++;
  124.     }
  125.  
  126. }
  127.  
  128.  
  129. DWORD WINAPI Thread1(LPVOID lpParam) { //поток 1
  130.     Thread1F(bu);
  131.     return 0;
  132. }
  133.  
  134. HANDLE CreateThread_1(Bu& bu, int Npr) {//Npr это приоритет потока
  135.  
  136.     HANDLE hThread_mass_sort;
  137.     DWORD ThreadIDs;
  138.  
  139.     hThread_mass_sort = CreateThread(
  140.         NULL,
  141.         0,
  142.         Thread1,
  143.         &bu // massiv parametrov
  144.         //0  // bez peredechiapram
  145.         ,
  146.         CREATE_SUSPENDED,
  147.         &ThreadIDs
  148.     );
  149.  
  150.     if (hThread_mass_sort == NULL) {
  151.         cout << "Thread failed" << GetLastError() << endl;
  152.     }
  153.  
  154.     SetThreadPriority(hThread_mass_sort, Npr); //THREAD_PRIORITY_NORMAL = 0
  155.     cout << "PriorytetS hThread_mass_sort = " << GetThreadPriority(hThread_mass_sort) << endl;
  156.     cout << "Thread Creation Success" << endl;
  157.     ResumeThread(hThread_mass_sort);/// zapusk potoka
  158.     cout << "ThreadID -->" << ThreadIDs << endl;
  159.     return hThread_mass_sort;
  160. }
  161.  
  162. DWORD WINAPI Thread2(LPVOID lpParam) { // поток 2
  163.     cout << "__ThreadRunning2__" << endl;
  164.     Thread2F(bu);
  165.     cout << "__________potok 2 zakonchen________" << endl;
  166.     return 0;
  167. }
  168.  
  169. HANDLE CreateThread_2(Bu& bu, int Npr) {//Npr это приоритет потока
  170.     HANDLE hThread_mass_sort;
  171.     DWORD ThreadIDs;
  172.  
  173.     hThread_mass_sort = CreateThread(
  174.         NULL,
  175.         0,
  176.         Thread2,
  177.         &bu // massiv parametrov
  178.         //0  // bez peredechiapram
  179.         ,
  180.         CREATE_SUSPENDED,
  181.         &ThreadIDs
  182.     );
  183.  
  184.     if (hThread_mass_sort == NULL) {
  185.         cout << "Thread failed" << GetLastError() << endl;
  186.     }
  187.     //zadat prioritet
  188.     SetThreadPriority(hThread_mass_sort, Npr); //THREAD_PRIORITY_NORMAL = 0
  189.     cout << "PriorytetS hThread_mass_sort = " << GetThreadPriority(hThread_mass_sort) << endl;
  190.     cout << "Thread Creation Success" << endl;
  191.     ResumeThread(hThread_mass_sort);/// zapusk potoka
  192.     cout << "ThreadID -->" << ThreadIDs << endl;
  193.     return hThread_mass_sort;
  194. }
  195.  
  196.  
  197. void main() {
  198.     HANDLE hThread_mass_sort1 = CreateThread_1(bu, 0);
  199.     HANDLE hThread_mass_sort2 = CreateThread_2(bu, 31);
  200.    
  201.     Sleep(3000);
  202.  
  203.     bu.printALL();
  204.     CloseHandle(hThread_mass_sort1);
  205.     CloseHandle(hThread_mass_sort2);
  206. }
  207.  
  208.  
  209.  
  210. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  211. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  212.  
  213. // Советы по началу работы
  214. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  215. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  216. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  217. //   4. В окне "Список ошибок" можно просматривать ошибки.
  218. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  219. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
  220.  
Add Comment
Please, Sign In to add comment