假设有很多线程,每个线程将执行以下三个操作中的一个:
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)会导致核心转储吗?
PS: list的元素是一个包含shared_ptr和整数的结构。我只想得到整数的值,有时我可以处理意外的值。我想要的是永远找不到核心垃圾堆。
我首先尝试调用list.back(),然后在list为空()时调用pop_back()或调用list.back()。
所有尝试都不能产生核心转储。
发布于 2022-11-28 05:06:23
保证操作1会导致未定义的行为。可能的未定义行为形式包括分段错误和/或核心转储,但也包括删除硬盘上的每个文件。
什么是没有保证是您得到的未定义行为的确切形式。这甚至可能因运行不同而有所不同。(当然,假设您有机会在您的硬盘被擦除之前再次运行您的程序)。
如果您可以使用“不可预测的”值,并且需要比互斥量更少的开销,那么就有了std::atomic<>
和memory_order_relaxed
。但是,这对于单个值非常有用,对于像std::list
这样复杂的数据结构则不适用。
简而言之:锁定每个列表操作的互斥对象。
https://stackoverflow.com/questions/74600653
复制相似问题