在Linux上用C实现一个线程安全的通用堆栈
在最近的一次采访中,我被要求在
Linux机器上的C中实现一个线程安全的通用(基于ietemplate)堆栈.
请提出任何意见/建议/改进. //实现线程安全的通用堆栈. #include<pthread.h> #include<iostream> #include<vector> using namespace std; template<typename T> class MyStack { public: //interface bool Push(T elem); bool Pop(T& elem); bool IsEmpty(); //constructor MyStack() { pthread_mutex_init(&lock); top = 0; } //destructor ~MyStack() { pthread_mutex_destroy(&lock); } private: pthread_mutex_t lock; int top; vector<T> stack; bool MyStack::Push(T elem); bool MyStack::PopElem(T& elem); }; //end of MyStack template<typename T> bool MyStack<T>::Push(T elem) { pthread_mutex_lock(&lock); PushElem(elem); pthread_mutex_unlock(&lock); } template<typename T> bool MyStack<T>::Pop(T& elem) { pthread_mutex_lock(&lock); PopElem(elem); pthread_mutex_unlock(&lock); } template<typename T> bool MyStack<T>::PushElem(T elem) { stack.push_back(elem); top = stack.size(); } template<typename T> bool MyStack<T>::PopElem(T& elem) { if(this.IsEmpty()) { return false; } elem = stack.back(); //tricky,returns a reference to the last element stack.pop_back(); // is elem valid after this ?? top = stack.size(); return true; } template<typename T> bool MyStack<T>::IsEmpty() { return stack.empty(); } class MyStackTest { public: void Initialize() { pthread_init(&readerT); pthread_init(&writerT); } void Run() { pthread_create(writerT,writer,0); pthread_create(readerT,reader,0); pthread_join(&writerT); pthread_join(&readerT); } private: pthread_t readerT; pthread_t writerT; MyStack<int> stack; void reader(void); void writer(void); }; void MyStackTest::writer() { for(int i=0;i<20;i++) { stack.Push(i); cout<<"nt Pushed element: "<<i; } //end for } void MyStackTest::reader() { int elem; while(stack.Pop(elem)) { cout<<"nt Popped: "<<elem; } } int main() { MyStackTest Test; Test.Run(); } 解决方法一些问题:>我会实施一个Locker类来声明&使用RAII释放互斥锁>我会使用std :: stack>我会让std :: stack的用户使用Locker来实现锁定策略 – 拥有一个锁定自身的堆栈是糟糕的设计,因为堆栈无法知道它是如何被使用的 (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |