Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SemBuf_14.05.2021.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
- //
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <thread>
- #include <ctime>
- #include <cstdlib>
- #include <windows.h>
- #include <stdio.h>
- #include <string.h>
- #include <random>
- using namespace std;
- class Bu
- {
- // первая фенкция содает ряд натуральных чисел
- public:
- int j;
- HANDLE semT1 = semT1F();
- HANDLE semT1F() {
- semT1 = CreateSemaphore(NULL, 1, 1, L"MySemaphoreNameT1");
- return semT1;
- CloseHandle(semT1);
- }
- void massivPP()
- {
- j++;
- if (j == 451) { system("pause"); exit(1); }
- }
- // вторая функция печатает число из массива
- public:
- int print;
- HANDLE semT2 = semT2F();
- HANDLE semT2F() {
- semT2 = CreateSemaphore(NULL, 1, 1, L"MySemaphoreNameT2");
- return semT2;
- CloseHandle(semT2);
- }
- void PrintOne()
- {
- cout << print << " massiv ---------- \n";
- }
- // функция буфера принимает элемент для записи
- public:
- HANDLE semBu;
- const int size9 = 9;
- int* bufer = new int[size9];
- int steps;
- int added;
- HANDLE semTBU() {
- semBu = CreateSemaphore(NULL, 9, 9, L"MySemaphoreNameBu");
- return semBu;
- }
- void add()
- {
- if (0 == steps % 9) {
- ReleaseSemaphore(semBu, 9, NULL); // обнуление буфера освобождение
- }
- bufer[steps % 9] = added;
- cout << " " << bufer[steps % 9] << " massiv ++++++++++\n";
- steps++;
- WaitForSingleObject(semBu, INFINITE); // счетчик максимально заполнение буфера
- }
- void printALL() { // печать проверка
- int i = 0;
- while (i < size9) {
- cout << "bufer [" << i << "] " << bufer[i] << endl;
- i++;
- }
- }
- private:
- };
- Bu bu;
- void Thread1F(Bu& bu) { //добавляем в буфер
- Sleep(1000);
- int i = 0;
- //Sleep(500);
- while (1) {
- bu.massivPP(); // увеличиваем массив
- bu.added = bu.j; bu.add(); // добавляем в буфер
- WaitForSingleObject(bu.semT2, INFINITE); // блокировка ввода
- ReleaseSemaphore(bu.semT1, 1, NULL); //разрешение печати
- i++;
- }
- }
- void Thread2F(Bu& bu) {// печатаем из буфера
- Sleep(1000);
- int i = 0;
- while (1) {
- bu.print = bu.added; // печатаем
- bu.PrintOne();
- WaitForSingleObject(bu.semT1, INFINITE); // блокировка печати
- ReleaseSemaphore(bu.semT2, 1, NULL); //разрешение ввода
- i++;
- }
- }
- DWORD WINAPI Thread1(LPVOID lpParam) { //поток 1
- Thread1F(bu);
- return 0;
- }
- HANDLE CreateThread_1(Bu& bu, int Npr) {//Npr это приоритет потока
- HANDLE hThread_mass_sort;
- DWORD ThreadIDs;
- hThread_mass_sort = CreateThread(
- NULL,
- 0,
- Thread1,
- &bu // massiv parametrov
- //0 // bez peredechiapram
- ,
- CREATE_SUSPENDED,
- &ThreadIDs
- );
- if (hThread_mass_sort == NULL) {
- cout << "Thread failed" << GetLastError() << endl;
- }
- SetThreadPriority(hThread_mass_sort, Npr); //THREAD_PRIORITY_NORMAL = 0
- cout << "PriorytetS hThread_mass_sort = " << GetThreadPriority(hThread_mass_sort) << endl;
- cout << "Thread Creation Success" << endl;
- ResumeThread(hThread_mass_sort);/// zapusk potoka
- cout << "ThreadID -->" << ThreadIDs << endl;
- return hThread_mass_sort;
- }
- DWORD WINAPI Thread2(LPVOID lpParam) { // поток 2
- cout << "__ThreadRunning2__" << endl;
- Thread2F(bu);
- cout << "__________potok 2 zakonchen________" << endl;
- return 0;
- }
- HANDLE CreateThread_2(Bu& bu, int Npr) {//Npr это приоритет потока
- HANDLE hThread_mass_sort;
- DWORD ThreadIDs;
- hThread_mass_sort = CreateThread(
- NULL,
- 0,
- Thread2,
- &bu // massiv parametrov
- //0 // bez peredechiapram
- ,
- CREATE_SUSPENDED,
- &ThreadIDs
- );
- if (hThread_mass_sort == NULL) {
- cout << "Thread failed" << GetLastError() << endl;
- }
- //zadat prioritet
- SetThreadPriority(hThread_mass_sort, Npr); //THREAD_PRIORITY_NORMAL = 0
- cout << "PriorytetS hThread_mass_sort = " << GetThreadPriority(hThread_mass_sort) << endl;
- cout << "Thread Creation Success" << endl;
- ResumeThread(hThread_mass_sort);/// zapusk potoka
- cout << "ThreadID -->" << ThreadIDs << endl;
- return hThread_mass_sort;
- }
- void main() {
- HANDLE hThread_mass_sort1 = CreateThread_1(bu, 0);
- HANDLE hThread_mass_sort2 = CreateThread_2(bu, 31);
- Sleep(3000);
- bu.printALL();
- CloseHandle(hThread_mass_sort1);
- CloseHandle(hThread_mass_sort2);
- }
- // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
- // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
- // Советы по началу работы
- // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
- // 2. В окне Team Explorer можно подключиться к системе управления версиями.
- // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
- // 4. В окне "Список ошибок" можно просматривать ошибки.
- // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
- // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Add Comment
Please, Sign In to add comment