c++ std::list::back()是否会产生核心转储?

qzwqbdag  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(205)

假设有很多线程,每个线程都将执行以下三种操作之一:

auto a = list.back(); // without mutex protection
list.pop_back();      // with mutex protection, guarantee list is not empty
list.push_front();    // with mutex protection

操作1)肯定会得到不可预知的值。操作1)会导致内核转储吗?
附言:列表元素是一个结构体,包含一个shared_ptr和一个integer。我只想得到integer的值,有时我可以处理意外的值。我想要的是永远不要找到核心转储。
我尝试先调用list.back(),然后再调用pop_back(),或者在list为空()时调用list.back()。
所有尝试都无法产生核心转储。

0sgqnhkj

0sgqnhkj1#

    • 保证操作1会导致未定义的行为**。未定义的行为的可能形式包括segfault和/或核心转储,但也会删除硬盘上的每个文件。
      不保证的是你得到的Undefined Behavior的确切形式。这甚至可以在不同的运行中变化。(当然,假设你有机会在硬盘被擦除之前再次运行你的程序)。

如果你可以接受一个“不可预测”的值,并且想要比互斥体更少的开销,那么std::atomic<>memory_order_relaxed就可以了,但是这主要是对单个值有用,而不是对std::list这样的复杂数据结构有用。
简而言之:在 every list操作时锁定互斥锁。

相关问题