加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

在Linux上用C实现一个线程安全的通用堆栈

发布时间:2020-12-30 18:47:05 所属栏目:Linux 来源:网络整理
导读:在最近的一次采访中,我被要求在 Linux机器上的C中实现一个线程安全的通用(基于ietemplate)堆栈. 我很快想出了以下内容(它可能有编译错误). 我完成了.面试官可能喜欢这个实现中的一些东西.也许设计部分:) 以下是此实现可能存在的一些问题: – 1.表示溢出/下

在最近的一次采访中,我被要求在 Linux机器上的C中实现一个线程安全的通用(基于ietemplate)堆栈.
我很快想出了以下内容(它可能有编译错误).
我完成了.面试官可能喜欢这个实现中的一些东西.也许设计部分:)
以下是此实现可能存在的一些问题: –
1.表示溢出/下溢的实现不正确.因为我使用STL向量作为底层数据结构,所以没有溢出处理.应该有这样的处理吗?此外,下溢(在Pop()中)产生false作为返回值.应该通过抛出异常来完成吗?
2. PopElem例程的实现.以下实施是否正确?
3.没有真正使用顶级元素.
4.编写器和读者线程启动之间的更好时间.

请提出任何意见/建议/改进.
谢谢.

//实现线程安全的通用堆栈.

#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来实现锁定策略 – 拥有一个锁定自身的堆栈是糟糕的设计,因为堆栈无法知道它是如何被使用的

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读