Я пишу потокобезопасный расширяемый массив / вектор с неизменяемыми данными.
Чтобы получить длину элемента, я загружаю атомное целое число.Резервирование большего количества места охраняется мьютексом.При бронировании, я должен обновить длину.Так как reserve
не вызывается одновременно, нужно ли хранить значение с помощью семантики релиза?Возможно ли, что инструкции в заблокированном регионе выполняются в другом порядке, как указано?
fn len(&self) -> usize {
// Do we need Acquire or is Relaxed enough?
self.len.load(atomic::Ordering::Acquire)
}
fn reserve(&self, additional: usize) {
let _guard = self.mutex.lock();
// this call happens while the mutex is locked. Is Relaxed fine or do we
// need Acquire?
let current_len = self.len.load(atomic::Ordering::Relaxed);
// ... do the reserving stuff ...
// this call happens while the mutex is locked. Do we need Release semantic
// or is Relaxed enough?
self.len.store(current_len + additional, atomic::Ordering::Release);
}
Я специально не добавил код для получения данных, так как это привело бы к обсуждениям, которые здесь не актуальны.