在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来实现锁定策略 – 拥有一个锁定自身的堆栈是糟糕的设计,因为堆栈无法知道它是如何被使用的 (编辑:52站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  

