Advertisement
Guest User

Untitled

a guest
Apr 16th, 2014
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.20 KB | None | 0 0
  1. // OS_Laba_9.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <Windows.h>
  7. #include <conio.h>
  8. #include <queue>
  9. #include <stdio.h>
  10. #include <iostream>
  11. #include <sstream>
  12.  
  13. using namespace std;
  14.  
  15. #define CREATE_THREAD(func, ThreadIdArray) CreateThread(NULL, 0,func, 0, 0, &ThreadIdArray);
  16.  
  17. queue<int> buffer;
  18. HANDLE fullBuffer;
  19. HANDLE emptyBuffer;
  20. HANDLE bufferMutex;
  21.  
  22. #define messageNumber 50
  23. #define threadNumber 4
  24. #define N 5
  25. static int counter = 0;
  26. static int readCounter = 0;
  27.  
  28.  
  29. volatile int threadCounter = 0;
  30.  
  31. void wait(HANDLE h)
  32. {
  33.     WaitForSingleObject(h, INFINITE);
  34. }
  35.  
  36. void notify(HANDLE h)
  37. {
  38.     ReleaseSemaphore(h,1,NULL);
  39. }
  40. void notifyMutex(HANDLE h)
  41. {
  42.     ReleaseMutex(h);
  43. }
  44.  
  45.  
  46. DWORD WINAPI producer(LPVOID lpParam)
  47. {
  48.     while (counter < messageNumber)
  49.     {
  50.         wait(emptyBuffer);
  51.         wait(bufferMutex);
  52.         buffer.push(counter);
  53.         printf("PRODUCER ADD %d SIZE: %d\n", counter, buffer.size());
  54.         counter++;
  55.         notifyMutex(bufferMutex);
  56.         notify(fullBuffer);
  57.     }
  58.     return 0;
  59. }
  60.  
  61. DWORD WINAPI consumer(LPVOID lpParam)
  62. {
  63.     while (readCounter < messageNumber)
  64.     {
  65.         wait(fullBuffer);
  66.         wait(bufferMutex);
  67.         int curr = buffer.front();
  68.         buffer.pop();
  69.         readCounter++;
  70.         printf("CONSUMER READ %d SIZE: %d\n", curr, buffer.size());
  71.         notifyMutex(bufferMutex);
  72.         notify(emptyBuffer);
  73.     }
  74.     return 0;
  75. }
  76.  
  77. void producerConsumerProblem()
  78. {
  79.     bufferMutex = CreateMutex(NULL, FALSE, NULL);
  80.     fullBuffer = CreateSemaphore(NULL, 0, N, NULL);
  81.     emptyBuffer = CreateSemaphore(NULL, N, N, NULL);
  82.     HANDLE hThreadArray[threadNumber];
  83.     DWORD ThreadIdArray[threadNumber];
  84.     for(int i=0; i<threadNumber/2; i++)
  85.     {
  86.         hThreadArray[i] = CREATE_THREAD(producer, ThreadIdArray[i])
  87.     }
  88.     for(int i=threadNumber/2; i<threadNumber; i++)
  89.     {
  90.         hThreadArray[i] = CREATE_THREAD(consumer, ThreadIdArray[i])
  91.     }
  92.  
  93.     WaitForMultipleObjects(threadNumber, hThreadArray, TRUE, INFINITE);
  94.  
  95.     for (int i = 0; i < threadNumber; i++)
  96.     {
  97.         CloseHandle(hThreadArray[i]);
  98.     }
  99. }
  100.  
  101. DWORD WINAPI ThreadProc(LPVOID args)
  102. {
  103.     Sleep(INFINITE);
  104.     //for(int i=0; i<(1<<24); ++i);
  105.     return 0;
  106. }
  107.  
  108. void GetMaxThreadNumber()
  109. {
  110.     int i;
  111.     for (i = 0; i < 10000000; i++)
  112.     {
  113.         DWORD id;
  114.         HANDLE h = CreateThread(NULL, 0, ThreadProc, NULL, 0, &id);
  115.         if (!h) break;
  116.         CloseHandle(h);
  117.     }
  118.     printf("Created %d threads\n", i);
  119. }
  120.  
  121. DWORD WINAPI print(LPVOID args)
  122. {
  123.     threadCounter++;
  124.     #ifdef _DEBUG
  125.         printf("START THREAD ID = %d\n", GetCurrentThreadId());
  126.     #endif
  127.     for (int i = 0; i<20000; i++);
  128.     #ifdef _DEBUG
  129.         printf("END THREAD ID = %d\n", GetCurrentThreadId());
  130.     #endif
  131.     return 0;
  132. }
  133.  
  134. void run10thread()
  135. {
  136.     HANDLE hThreadArray[10];
  137.     for (int i = 0; i<10; i++)
  138.     {
  139.         DWORD id;
  140.         hThreadArray[i] = CreateThread(NULL, 0, print, NULL, 0, &id);
  141.         printf("Run Thread ID %d\n", id);
  142.     }
  143.     //WaitForMultipleObjects(10, hThreadArray, TRUE, INFINITE);
  144.     WaitForSingleObject(hThreadArray[0],INFINITE);
  145.     for (int i = 0; i < 10; i++)
  146.     {
  147.         CloseHandle(hThreadArray[i]);
  148.     }
  149.     printf("==========\nTHREAD COUNTER = %d\n", threadCounter);
  150. }
  151.  
  152. int _tmain(int argc, _TCHAR* argv[])
  153. {
  154.     //producerConsumerProblem();
  155.     //GetMaxThreadNumber();
  156.     //run10thread();
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement