// State below is protected by mutex_
port::Mutex mutex_;
std::atomic shutting_down_;
port::CondVar background_work_finished_signal_ GUARDED_BY(mutex_);
MemTable* mem_;
MemTable* imm_ GUARDED_BY(mutex_); // Memtable being compacted
std::atomic has_imm_; // So bg thread can detect non-null imm_
WritableFile* logfile_;
uint64_t logfile_number_ GUARDED_BY(mutex_);
log::Writer* log_;
uint32_t seed_ GUARDED_BY(mutex_); // For sampling.
// Queue of writers.
std::deque writers_ GUARDED_BY(mutex_);
Почему leveldb использует мьютекс для защиты дека writers_ (используется для хранения операций записи) и memtable imm_ вместо использования блокировки чтения-записи синхронизировать операции записи? В чем преимущество такого подхода?
Я видел следующий код в leveldb: [code] // State below is protected by mutex_ port::Mutex mutex_; std::atomic shutting_down_; port::CondVar background_work_finished_signal_ GUARDED_BY(mutex_); MemTable* mem_; MemTable* imm_ GUARDED_BY(mutex_); // Memtable being compacted std::atomic has_imm_; // So bg thread can detect non-null imm_ WritableFile* logfile_; uint64_t logfile_number_ GUARDED_BY(mutex_); log::Writer* log_; uint32_t seed_ GUARDED_BY(mutex_); // For sampling.
// Queue of writers. std::deque writers_ GUARDED_BY(mutex_); [/code] Почему leveldb использует мьютекс для защиты дека writers_ (используется для хранения операций записи) и memtable imm_ вместо использования блокировки чтения-записи синхронизировать операции записи? В чем преимущество такого подхода?