Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <algorithm>
- #include <process.h>
- #include <iostream>
- #include <stack>
- #include <string>
- #include <vector>
- #include <thread>
- #include <time.h>
- constexpr auto nw = 4;
- constexpr auto nr = 8;
- volatile long nWriters = nw;
- volatile long nReaders = nr;
- using namespace std;
- class WRStack {
- private:
- stack<int> _st;
- HANDLE hSemaphore;
- public:
- WRStack() { hSemaphore = CreateSemaphore(NULL, 2, 2, NULL); }
- void _push(int value, int threadId) {
- WaitForSingleObject(hSemaphore, INFINITE);
- _st.push(value);
- cout << "writer: " << threadId << " value: " << value << endl;
- Sleep(100);
- ReleaseSemaphore(hSemaphore, 1, NULL);
- }
- void _pop(int threadId) {
- WaitForSingleObject(hSemaphore, INFINITE);
- if (!_st.empty()) {
- int value = _st.top();
- _st.pop();
- cout << "reader: " << threadId << " value: " << value << endl;
- }
- Sleep(100);
- ReleaseSemaphore(hSemaphore, 1, NULL);
- }
- ~WRStack() { CloseHandle(hSemaphore); }
- } wrStack;
- void writer(int threadId) {
- while (_InterlockedDecrement(&nWriters) >= 0) {
- int num = rand() % 20;
- wrStack._push(num, threadId);
- }
- }
- void reader(int threadId) {
- while (_InterlockedDecrement(&nReaders) >= 0)
- wrStack._pop(threadId);
- }
- int main() {
- srand(time(NULL));
- thread hThread[nw+nr];
- for (int w = 0; w < nw; w++)
- hThread[w] = thread{ writer, w };
- for (int r = nw; r < nw+nr; r++)
- hThread[r] = thread{ reader, r - nw };
- for (int i = 0; i < nw+nr; i++)
- hThread[i].join();
- cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement