gpt4 book ai didi

c++ - 在 Linux 上用 C++ 实现线程安全的通用堆栈

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:29 27 4
gpt4 key购买 nike

在最近的一次采访中,我被要求在 Linux 机器上用 C++ 实现一个线程安全的通用(即基于模板的)堆栈。
我很快想到了以下(可能有编译错误)。
我打通了。面试官可能喜欢这个实现中的某些东西。也许是设计部分:)
以下是此实现可能存在的一些问题:-
1. 指示上溢/下溢的实现不正确。没有溢出处理,因为我使用 STL vector 作为底层数据结构。应该有这样的处理吗?此外,下溢(在 Pop() 中)产生 false 作为返回值。是否应该通过抛出异常来完成?
2. PopElem例程的实现。下面的实现是否正确?
3. 没有真正使用top元素。
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,0,writer,0);
pthread_create(readerT,0,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<<"\n\t Pushed element: "<<i;
} //end for
}

void MyStackTest::reader() {
int elem;
while(stack.Pop(elem))
{
cout<<"\n\t Popped: "<<elem;
}
}

int main()
{
MyStackTest Test;

Test.Run();
}

最佳答案

一些问题:

  • 我会实现一个 Locker 类来使用 RAII 声明和释放互斥量
  • 我会使用 std::stack
  • 我会让 std::stack 的用户使用 Locker 来实现锁定策略——拥有一个 self 锁定的堆栈是糟糕的设计,因为堆栈不知道如何使用它

关于c++ - 在 Linux 上用 C++ 实现线程安全的通用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com