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

C++中的线程安全堆栈:组合的顶部()和弹出()

发布时间:2022-12-14 15:36:19 所属栏目:大数据 来源:转载
导读: Anthony Williams在他的优秀著作《C++ Concurrency in Action》(第2版,包括C++17)中讨论了线程安全堆栈的实现。
在这个过程中,他提出了std::stack的适配器实现,其中包括将top()和pop(

Anthony Williams在他的优秀著作《C++ Concurrency in Action》(第2版,包括C++17)中讨论了线程安全堆栈的实现。

在这个过程中,他提出了std::stack的适配器实现,其中包括将top()和pop()的调用合并为一个。然而,在std::stack中,由于某种原因,将其分离为两个单独的函数,即避免在将弹出的元素返回给调用者时可能产生的副本在复制构造函数内部引发异常的情况下丢失数据。当返回时,则该元件将已经被弹出并且必然丢失。

大数据堆栈_内存被改为堆栈段后数据会改变_堆栈多数据进行存取的方式是

他没有使用T pop()函数,而是提出了pop的其他变体,这些变体能够将元素从堆栈中移除,并在一次操作中将其提供给调用者,但所有这些变体都有自己的问题。

他提出的第一个替代方案的签名是void pop(T&)。调用者传入一个对T的引用,并以这种方式获取弹出的对象。然而,这种方法带来了一个问题,即在调用pop之前需要构造一个T,这可能是一个开销很大的操作。或者根本不可能预先构造T,因为当时可能还没有必要的数据。作者提到的另一个问题是T可能是不可赋值的,而这是本解决方案所需要的。

我的问题是如果我们传递一个std::optional&而不是一个T&,上面提到的所有问题不都可以解决吗?

在这种情况下,在调用pop之前,不需要构造T的示例。此外,也不再需要可赋值性大数据堆栈,因为要返回的对象可以直接使用emplace函数构造到std::optional示例中。

我是在这里遗漏了一些关键的东西还是我是对的?如果我确实是对的,我会很好奇为什么没有考虑到这一点(有很好的理由还是仅仅是一个明显的疏忽?)。

(编辑:温州站长网)

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