chapter 6 code

This commit is contained in:
Bo Wang
2016-11-01 00:18:21 -04:00
parent 39e08c0cfc
commit 809451045e
7 changed files with 715 additions and 0 deletions

62
ch6/stack.cpp Normal file
View File

@@ -0,0 +1,62 @@
#include <exception>
#include <iostream>
#include <stack>
#include <memory>
#include <thread>
#include <mutex>
template <typename T>
class stack
{
private:
std::stack<T> data;
mutable std::mutex m;
public:
stack(){}
stack(const stack& other)
{
std::lock_guard<std::mutex> lock(other.m);
data = other.data;
}
stack& operator=(const stack&) = delete;
void push(T new_value)
{
std::lock_guard<std::mutex> lock(m);
data.push(new_value);
}
std::shared_ptr<T> pop()
{
std::lock_guard<std::mutex> lock(m);
if (data.empty()) throw std::underflow_error("empty stack");
std::shared_ptr<T> const res(new T(data.top()));
data.pop();
return res;
}
void pop(T& value)
{
std::lock_guard<std::mutex> lock(m);
if (data.empty()) throw std::underflow_error("empty stack");
value = data.top();
data.pop();
}
bool empty() const
{
std::lock_guard<std::mutex> lock(m);
return data.empty();
}
};
int main()
{
stack<int> s;
s.push(1);
std::cout << *s.pop() << std::endl;
}