У меня есть набор структур данных, которые мне нужно защитить с помощью блокировки чтения/записи. Мне известно о boost:: shared_lock, но я хотел бы иметь специальную реализацию, используя std:: mutex, std:: condition_variable и/или std:: atomic, чтобы я мог лучше понять, как это работает (и затем настроить позже),
Каждая структура данных (подвижная, но не копируемая) наследуется от класса Commons, который инкапсулирует блокировку. Я бы хотел, чтобы публичный интерфейс выглядел примерно так:
class Commons {
public:
void read_lock();
bool try_read_lock();
void read_unlock();
void write_lock();
bool try_write_lock();
void write_unlock();
};
... так, чтобы он мог быть наследуется некоторыми пользователями:
class DataStructure : public Commons {};
Я пишу научный код и, как правило, избегаю гонок данных; этот замок в основном является защитой от ошибок, которые я, вероятно, сделаю позже. Таким образом, мой приоритет - низкие накладные расходы, поэтому я не слишком затрудняю работу программы с корректным запуском. Каждый поток, вероятно, будет работать на собственном ядре процессора.
Не могли бы вы показать мне (псевдокод в порядке) блокировки для чтения/записи? Теперь я должен быть вариантом, который предотвращает голод писателя. Моя основная проблема до сих пор была пробелом в read_lock между проверкой того, безопасно ли чтение для фактического увеличения количества считывателей, после чего write_lock знает, что ждать.
void Commons::write_lock() {
write_mutex.lock();
reading_mode.store(false);
while(readers.load() > 0) {}
}
void Commons::try_read_lock() {
if(reading_mode.load()) {
//if another thread calls write_lock here, bad things can happen
++readers;
return true;
} else return false;
}
Я немного новичок в многопоточности, и мне очень хотелось бы это понять. Заранее благодарим за помощь!