gpt4 book ai didi

c++ - 线程安全的 C++ 堆栈

转载 作者:IT老高 更新时间:2023-10-28 22:34:30 26 4
gpt4 key购买 nike

我是 C++ 新手,正在编写一个多线程应用程序,通过该应用程序不同的编写者将对象推送到堆栈上,而读者将它们从堆栈中拉出(或至少将指针推送到对象)..

是否有任何内置于 C++ 中的结构可以在不添加锁定代码等的情况下处理此问题?如果没有,那么 Boost 库呢?

编辑:

嗨。感谢您最初的精彩回答。我想我认为这可能是内置的一个原因是我纯粹在 x86 空间中思考,并认为指针的 PUSH/POP 应该是指令级别的原子操作。

我不确定我最初的预感是否正确,但我想这不一定适用于所有平台。虽然如果在 x86 上运行,您是否会将原子 PUSH 和 POP 放入堆栈,如果是,这是否实质上使其无锁?

最佳答案

是的:Boost.Thread很棒,应该非常适合您的需求。 (如今,很多人说您几乎可以将 Boost 视为内置功能。)

仍然没有可以开箱即用的类,但是一旦掌握了同步原语,就可以非常简单地实现自己的线程安全包装器,例如,std::stack。它可能看起来像这样(不是实现每个方法...):

template <typename T> class MyThreadSafeStack {
public:
void push(const T& item) {
boost::mutex::scoped_lock lock(m_mutex);
m_stack.push(item);
}
void pop() {
boost::mutex::scoped_lock lock(m_mutex);
m_stack.pop();
}
T top() const { // note that we shouldn't return a reference,
// because another thread might pop() this
// object in the meanwhile
boost::mutex::scoped_lock lock(m_mutex);
return m_stack.top();
}

private:
mutable boost::mutex m_mutex;
std::stack<T> m_stack;
}

如果您是 C++ 新手,请了解 RAII .与这种情况相关,Boost.Thread 具有“作用域锁”类,以防止忘记释放锁而使自己陷入困境。

如果你发现自己在编写这样的代码:

void doStuff() {
myLock.lock();
if (!condition) {
reportError();
myLock.unlock();
return;
}
try {
doStuffThatMayThrow();
}
catch (std::exception& e) {
myLock.unlock();
throw e;
}
doMoreStuff();
myLock.unlock();
}

,那么你应该直接说不,转而使用 RAII(不是直接来自 Boost 的语法):

void doStuff() {
scoped_lock lock;
if (!condition) {
reportError();
return;
}
doStuffThatMayThrow();
doMoreStuff();
}

关键是当 scoped_lock 对象超出范围时,它的析构函数会释放资源——在本例中是锁。无论您是通过抛出异常退出范围,还是通过执行您的同事在您的函数中间偷偷添加的奇怪的 return 语句,或者只是通过到达函数。

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

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