Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OS_Laba_9.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <Windows.h>
- #include <conio.h>
- #include <queue>
- #include <stdio.h>
- #include <iostream>
- #include <sstream>
- using namespace std;
- #define CREATE_THREAD(func, ThreadIdArray) CreateThread(NULL, 0,func, 0, 0, &ThreadIdArray);
- queue<int> buffer;
- HANDLE fullBuffer;
- HANDLE emptyBuffer;
- HANDLE bufferMutex;
- #define messageNumber 50
- #define threadNumber 4
- #define N 5
- static int counter = 0;
- static int readCounter = 0;
- volatile int threadCounter = 0;
- void wait(HANDLE h)
- {
- WaitForSingleObject(h, INFINITE);
- }
- void notify(HANDLE h)
- {
- ReleaseSemaphore(h,1,NULL);
- }
- void notifyMutex(HANDLE h)
- {
- ReleaseMutex(h);
- }
- DWORD WINAPI producer(LPVOID lpParam)
- {
- while (counter < messageNumber)
- {
- wait(emptyBuffer);
- wait(bufferMutex);
- buffer.push(counter);
- printf("PRODUCER ADD %d SIZE: %d\n", counter, buffer.size());
- counter++;
- notifyMutex(bufferMutex);
- notify(fullBuffer);
- }
- return 0;
- }
- DWORD WINAPI consumer(LPVOID lpParam)
- {
- while (readCounter < messageNumber)
- {
- wait(fullBuffer);
- wait(bufferMutex);
- int curr = buffer.front();
- buffer.pop();
- readCounter++;
- printf("CONSUMER READ %d SIZE: %d\n", curr, buffer.size());
- notifyMutex(bufferMutex);
- notify(emptyBuffer);
- }
- return 0;
- }
- void producerConsumerProblem()
- {
- bufferMutex = CreateMutex(NULL, FALSE, NULL);
- fullBuffer = CreateSemaphore(NULL, 0, N, NULL);
- emptyBuffer = CreateSemaphore(NULL, N, N, NULL);
- HANDLE hThreadArray[threadNumber];
- DWORD ThreadIdArray[threadNumber];
- for(int i=0; i<threadNumber/2; i++)
- {
- hThreadArray[i] = CREATE_THREAD(producer, ThreadIdArray[i])
- }
- for(int i=threadNumber/2; i<threadNumber; i++)
- {
- hThreadArray[i] = CREATE_THREAD(consumer, ThreadIdArray[i])
- }
- WaitForMultipleObjects(threadNumber, hThreadArray, TRUE, INFINITE);
- for (int i = 0; i < threadNumber; i++)
- {
- CloseHandle(hThreadArray[i]);
- }
- }
- DWORD WINAPI ThreadProc(LPVOID args)
- {
- Sleep(INFINITE);
- //for(int i=0; i<(1<<24); ++i);
- return 0;
- }
- void GetMaxThreadNumber()
- {
- int i;
- for (i = 0; i < 10000000; i++)
- {
- DWORD id;
- HANDLE h = CreateThread(NULL, 0, ThreadProc, NULL, 0, &id);
- if (!h) break;
- CloseHandle(h);
- }
- printf("Created %d threads\n", i);
- }
- DWORD WINAPI print(LPVOID args)
- {
- threadCounter++;
- #ifdef _DEBUG
- printf("START THREAD ID = %d\n", GetCurrentThreadId());
- #endif
- for (int i = 0; i<20000; i++);
- #ifdef _DEBUG
- printf("END THREAD ID = %d\n", GetCurrentThreadId());
- #endif
- return 0;
- }
- void run10thread()
- {
- HANDLE hThreadArray[10];
- for (int i = 0; i<10; i++)
- {
- DWORD id;
- hThreadArray[i] = CreateThread(NULL, 0, print, NULL, 0, &id);
- printf("Run Thread ID %d\n", id);
- }
- //WaitForMultipleObjects(10, hThreadArray, TRUE, INFINITE);
- WaitForSingleObject(hThreadArray[0],INFINITE);
- for (int i = 0; i < 10; i++)
- {
- CloseHandle(hThreadArray[i]);
- }
- printf("==========\nTHREAD COUNTER = %d\n", threadCounter);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- //producerConsumerProblem();
- //GetMaxThreadNumber();
- //run10thread();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement