假设有很多线程,每个线程都将执行以下三种操作之一:
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()。
所有尝试都无法产生核心转储。
1条答案
按热度按时间0sgqnhkj1#
不保证的是你得到的Undefined Behavior的确切形式。这甚至可以在不同的运行中变化。(当然,假设你有机会在硬盘被擦除之前再次运行你的程序)。
如果你可以接受一个“不可预测”的值,并且想要比互斥体更少的开销,那么
std::atomic<>
和memory_order_relaxed
就可以了,但是这主要是对单个值有用,而不是对std::list
这样的复杂数据结构有用。简而言之:在 every list操作时锁定互斥锁。