Savelyev_Vyacheslav

OS_4_ANZH

May 23rd, 2021 (edited)
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.81 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4.  
  5. #include <thread>
  6.  
  7. #include <ctime>
  8.  
  9. #include <cstdlib>
  10.  
  11. #include <windows.h>
  12.  
  13. #include <stdio.h>
  14.  
  15. #include <string.h>
  16.  
  17. #include <random>
  18.  
  19. using namespace std;
  20.  
  21. class GETtime {
  22.  
  23. public:
  24.     int milisecTotal;
  25.     int min_t;
  26.     int sec_t;
  27.     int MSCostatok;
  28.     void endT() {
  29.         tEnd = std::chrono::high_resolution_clock::now();
  30.         chrono::duration < float > duration = (tEnd - tStart) * 1000;
  31.         GETtime::milisecTotal = duration.count();
  32.         GETtime::min_t = (duration.count() / 1000 / 60);
  33.         GETtime::sec_t = int(duration.count() / 1000) % 60;
  34.         GETtime::MSCostatok = int(duration.count()) - min_t * 60 * 1000 - sec_t * 1000;
  35.         chrono::duration < float > Tstrt = tStart - tStart;
  36.         cout << "Tend: " << duration.count() << endl;
  37.     }
  38.     void strtT() {
  39.         tStart = std::chrono::high_resolution_clock::now();
  40.         chrono::duration < float > Tstrt = tStart - tStart;
  41.         cout << "Tstrt: " << Tstrt.count() << endl;
  42.     }
  43.     void print_Iter() {
  44.         cout << "min- " << GETtime::min_t << "sec- " << GETtime::sec_t << "milSec- " << GETtime::MSCostatok << endl;
  45.     }
  46. private:
  47.     std::chrono::time_point < std::chrono::steady_clock > tStart, tEnd;
  48. };
  49.  
  50. GETtime t;
  51. class Bufer {
  52. public:
  53.     int p;
  54.     HANDLE sem_P1 = sem_P1_fun();
  55.     HANDLE sem_P1_fun() {
  56.         sem_P1 = CreateSemaphore(NULL, 1, 1, L"SemaphoreP1");
  57.         return sem_P1;
  58.         CloseHandle(sem_P1);
  59.     }
  60.  
  61.     void massivPP() {
  62.         p++; p++;
  63.  
  64.         if (p == 332) {
  65.             t.endT();
  66.             system("PAUSE");
  67.             exit(1);
  68.         }
  69.     }
  70.  
  71. public:
  72.     int print;
  73.     HANDLE sem_P2 = sem_P2_fun();
  74.     HANDLE sem_P2_fun() {
  75.         sem_P2 = CreateSemaphore(NULL, 1, 1, L"MySemaphoreNameT2");
  76.         return sem_P2;
  77.         CloseHandle(sem_P2);
  78.     }
  79.  
  80.     void PrintOne() {
  81.         cout <<"<"<<print << ">";
  82.     }
  83.     //  буфер принимает элемент для записи
  84. public:
  85.     HANDLE SembuferF;
  86.     const int SIZE = 8;
  87.     int* bufer = new int[SIZE];
  88.     int steps;
  89.     int puted;
  90.  
  91.     HANDLE SembuferFfer() {
  92.         SembuferF = CreateSemaphore(NULL, 8, 8, L"SemaphorebuferF");
  93.         return SembuferF;
  94.     }
  95.     void put() {
  96.         if (0 == steps % 8) {
  97.             ReleaseSemaphore(SembuferF, 8, NULL); // обнуление буфера освобождение
  98.             cout << "\n";
  99.             printARR();
  100.         }
  101.         bufer[steps % 8] = puted;
  102.         cout << "{" << bufer[steps % 8] << "}";
  103.  
  104.         steps++;
  105.         WaitForSingleObject(SembuferF, INFINITE); // счетчик максимально заполнение буфера
  106.     }
  107.  
  108.     void printARR() { // печать проверка
  109.         int i = 0;
  110.         while (i < SIZE) {
  111.             cout << "bufer (" << i << ") " << bufer[i] << endl;
  112.             i++;
  113.         }
  114.     }
  115.  
  116. private:
  117. };
  118.  
  119. Bufer bufer;
  120.  
  121. void ThreadN_1P(Bufer& bufer) { //добавляем в буфер
  122.  
  123.     Sleep(300);
  124.     int i = 0;
  125.  
  126.     t.strtT();
  127.     while (1) {
  128.         bufer.massivPP(); // увеличиваем массив
  129.         bufer.puted = bufer.p;
  130.         bufer.put(); // добавляем в буфер
  131.         WaitForSingleObject(bufer.sem_P2, INFINITE); // блокировка ввода
  132.         ReleaseSemaphore(bufer.sem_P1, 1, NULL); //разрешение печати
  133.         i++;
  134.     }
  135. }
  136.  
  137. void ThreadN_2P(Bufer& bufer) { // печатаем из буфера
  138.  
  139.     Sleep(300);
  140.     int i = 0;
  141.  
  142.     while (1) {
  143.         bufer.print = bufer.puted; // печатаем
  144.         bufer.PrintOne();
  145.         WaitForSingleObject(bufer.sem_P1, INFINITE); // блокировка печати
  146.         ReleaseSemaphore(bufer.sem_P2, 1, NULL); //разрешение ввода
  147.         i++;
  148.     }
  149.  
  150. }
  151.  
  152. DWORD WINAPI ThreadN_1(LPVOID lpParam) { //поток 1
  153.  
  154.     ThreadN_1P(bufer);
  155.     return 0;
  156. }
  157.  
  158. HANDLE CreateThread_1(Bufer& bufer, int nPtr) { //nPtr это приоритет потока
  159.  
  160.     HANDLE hThrMassSort;
  161.     DWORD ThrID;
  162.  
  163.     hThrMassSort = CreateThread(
  164.         NULL,
  165.         0,
  166.         ThreadN_1, &
  167.         bufer // massiv parametrov
  168.         ,
  169.         CREATE_SUSPENDED, &
  170.         ThrID
  171.     );
  172.  
  173.     if (hThrMassSort == NULL) {
  174.         cout << "Thread-failed" << GetLastError() << endl;
  175.     }
  176.  
  177.     SetThreadPriority(hThrMassSort, nPtr); // THREAD_PRIORITY_NORMAL = 0
  178.     cout << "Priorytet hThread-mass-sort = " << GetThreadPriority(hThrMassSort) << endl;
  179.     cout << "Thread-Creation-Success" << endl;
  180.     ResumeThread(hThrMassSort); /// start potoka
  181.     cout << "ThreadID=" << ThrID << endl;
  182.     return hThrMassSort;
  183. }
  184.  
  185. DWORD WINAPI ThreadN_2(LPVOID lpParam) { // поток-2
  186.     cout << "Thread-Running-2" << endl;
  187.     ThreadN_2P(bufer);
  188.     return 0;
  189. }
  190.  
  191. HANDLE CreateThread_2(Bufer& bufer, int nPtr) { //nPtr это приоритет потока
  192.     HANDLE hThrMassSort;
  193.     DWORD ThrID;
  194.  
  195.     hThrMassSort = CreateThread(
  196.         NULL,
  197.         0,
  198.         ThreadN_2, &
  199.         bufer // arr parametrov
  200.         ,
  201.         CREATE_SUSPENDED, &
  202.         ThrID
  203.     );
  204.  
  205.     if (hThrMassSort == NULL) {
  206.         cout << "Thread-failed" << GetLastError() << endl;
  207.     }
  208.     //set prioritet
  209.     SetThreadPriority(hThrMassSort, nPtr); //THREAD_PRIORITY_NORMAL = 0
  210.     cout << "Priorytet-Thread-2" << GetThreadPriority(hThrMassSort) << endl;
  211.     cout << "Thread-Creation-Success" << endl;
  212.     ResumeThread(hThrMassSort); /// start potoka
  213.     cout << "ThreadID=" << ThrID << endl;
  214.     return hThrMassSort;
  215. }
  216.  
  217. void main() {
  218.  
  219.     HANDLE hThrMassSort1 = CreateThread_1(bufer, 15);
  220.     HANDLE hThrMassSort2 = CreateThread_2(bufer, -15);
  221.  
  222.     Sleep(4000);
  223.     bufer.printARR();
  224.     CloseHandle(hThrMassSort1);
  225.     CloseHandle(hThrMassSort2);
  226. }
Add Comment
Please, Sign In to add comment