Advertisement
chuuupa

tetete

Feb 17th, 2021
820
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <algorithm>
  3. #include <process.h>
  4. #include <iostream>
  5. #include <stack>
  6. #include <string>
  7. #include <vector>
  8. #include <thread>
  9. #include <time.h>
  10.  
  11. constexpr auto nw = 4;
  12. constexpr auto nr = 8;
  13.  
  14. volatile long nWriters = nw;
  15. volatile long nReaders = nr;
  16.  
  17. using namespace std;
  18.  
  19. class WRStack {
  20. private:
  21.     stack<int> _st;
  22.     HANDLE hSemaphore;
  23.  
  24. public:
  25.     WRStack() { hSemaphore = CreateSemaphore(NULL, 2, 2, NULL); }
  26.  
  27.     void _push(int value, int threadId) {
  28.         WaitForSingleObject(hSemaphore, INFINITE);
  29.         _st.push(value);
  30.  
  31.         cout << "writer: " << threadId << "  value: " << value << endl;
  32.  
  33.         Sleep(100);
  34.         ReleaseSemaphore(hSemaphore, 1, NULL);
  35.     }
  36.  
  37.     void _pop(int threadId) {
  38.         WaitForSingleObject(hSemaphore, INFINITE);
  39.  
  40.         if (!_st.empty()) {
  41.             int value = _st.top();
  42.             _st.pop();
  43.             cout << "reader: " << threadId << " value: " << value << endl;
  44.         }
  45.  
  46.         Sleep(100);
  47.         ReleaseSemaphore(hSemaphore, 1, NULL);
  48.     }
  49.  
  50.     ~WRStack() { CloseHandle(hSemaphore); }
  51.  
  52. } wrStack;
  53.  
  54.  
  55. void writer(int threadId) {
  56.     while (_InterlockedDecrement(&nWriters) >= 0) {
  57.         int num = rand() % 20;
  58.         wrStack._push(num, threadId);
  59.     }
  60.        
  61. }
  62.  
  63. void reader(int threadId) {
  64.     while (_InterlockedDecrement(&nReaders) >= 0)
  65.         wrStack._pop(threadId);
  66. }
  67.  
  68. int main() {
  69.     srand(time(NULL));
  70.     thread hThread[nw+nr];
  71.  
  72.     for (int w = 0; w < nw; w++)
  73.         hThread[w] = thread{ writer, w };
  74.  
  75.     for (int r = nw; r < nw+nr; r++)
  76.         hThread[r] = thread{ reader, r - nw };
  77.  
  78.     for (int i = 0; i < nw+nr; i++)
  79.         hThread[i].join();
  80.  
  81.     cin.get();
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement