Нужно ли получать / освобождать, когда освобождение происходит только в заблокированной области мьютекса? - PullRequest
0 голосов
/ 19 октября 2018

Я пишу потокобезопасный расширяемый массив / вектор с неизменяемыми данными.

Чтобы получить длину элемента, я загружаю атомное целое число.Резервирование большего количества места охраняется мьютексом.При бронировании, я должен обновить длину.Так как 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);
}

Я специально не добавил код для получения данных, так как это привело бы к обсуждениям, которые здесь не актуальны.

...