Блокировки чтения / записи в C++

Я ищу хорошую блокировку чтения / записи 9X_threads на C++. У нас есть вариант использования 9X_multi-threaded одного нечастого писателя и множества частых 9X_thread читателей, и мы хотели бы оптимизировать 9X_multithread его для этого. Я бы предпочел кроссплатформенное 9X_cxx решение, но подойдет только Windows.

75
0
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Блокировки чтения / записи в C++

Начиная с C++ 17 (VS2015) вы можете использовать 9X_thread стандарт:

#include typedef std::shared_mutex Lock; typedef std::unique_lock< Lock > WriteLock; typedef std::shared_lock< Lock > ReadLock; Lock myLock; void ReadFunction() { ReadLock r_lock(myLock); //Do reader stuff } void WriteFunction() { WriteLock w_lock(myLock); //Do writer stuff } 

Для более старых версий и стандартов 9X_threads компилятора вы можете использовать boost для 9X_multithreading создания блокировки чтения-записи:

#include #include typedef boost::shared_mutex Lock; typedef boost::unique_lock< Lock > WriteLock; typedef boost::shared_lock< Lock > ReadLock; 

50
0

Ответ #2

Ответ на вопрос: Блокировки чтения / записи в C++

Более новые версии boost::thread имеют блокировки чтения 9X_multi-threaded / записи (1.35.0 и более поздние версии, очевидно, предыдущие 9X_thread версии работали некорректно).

У них есть 9X_multi-threaded имена shared_lock, unique_lock и upgrade_lock, и они работают с shared_mutex.

37
2

  • Мы на 1.34.1, это может быть поводом для перехо ...

Ответ #3

Ответ на вопрос: Блокировки чтения / записи в C++

Использование стандартных предварительно 9X_cross-threading протестированных, предварительно созданных 9X_lock вещей всегда хорошо (например, Boost в качестве 9X_lock другого варианта ответа), но это не так 9X_locking уж сложно создать самостоятельно. Вот небольшая 9X_cross-threading глупая реализация, извлеченная из моего 9X_thread проекта:

#include struct rwlock { pthread_mutex_t lock; pthread_cond_t read, write; unsigned readers, writers, read_waiters, write_waiters; }; void reader_lock(struct rwlock *self) { pthread_mutex_lock(&self->lock); if (self->writers || self->write_waiters) { self->read_waiters++; do pthread_cond_wait(&self->read, &self->lock); while (self->writers || self->write_waiters); self->read_waiters--; } self->readers++; pthread_mutex_unlock(&self->lock); } void reader_unlock(struct rwlock *self) { pthread_mutex_lock(&self->lock); self->readers--; if (self->write_waiters) pthread_cond_signal(&self->write); pthread_mutex_unlock(&self->lock); } void writer_lock(struct rwlock *self) { pthread_mutex_lock(&self->lock); if (self->readers || self->writers) { self->write_waiters++; do pthread_cond_wait(&self->write, &self->lock); while (self->readers || self->writers); self->write_waiters--; } self->writers = 1; pthread_mutex_unlock(&self->lock); } void writer_unlock(struct rwlock *self) { pthread_mutex_lock(&self->lock); self->writers = 0; if (self->write_waiters) pthread_cond_signal(&self->write); else if (self->read_waiters) pthread_cond_broadcast(&self->read); pthread_mutex_unlock(&self->lock); } void rwlock_init(struct rwlock *self) { self->readers = self->writers = self->read_waiters = self->write_waiters = 0; pthread_mutex_init(&self->lock, NULL); pthread_cond_init(&self->read, NULL); pthread_cond_init(&self->write, NULL); } 

pthreads на самом деле не является Windows-родным, но 9X_lock общая идея здесь. Эта реализация немного 9X_threads смещена в сторону писателей (толпа писателей 9X_thread может бесконечно морить читателей голодом); просто 9X_cross-threading измените writer_unlock, если хотите, чтобы баланс был 9X_cross-threading наоборот.

Да, это C, а не C++. Перевод - это 9X_threads упражнение, оставленное читателю.

Изменить

Грег Роджерс 9X_multithread указал, что стандарт POSIX действительно 9X_threads определяет pthread_rwlock_*. Это не поможет, если у вас 9X_threading нет pthreads, но заставило меня вспомнить: Pthreads-w32 должен 9X_cxx работать! Вместо того, чтобы переносить 9X_thread этот код на не pthreads для собственного использования, просто 9X_cxx используйте Pthreads-w32 в Windows и нативный 9X_c++ pthreads везде.

36
4

  • Мне любопытно, почему вы повторно реализовали блокировку pthread_rwlock_ (rd / wr) (un) поверх p ...

Ответ #4

Ответ на вопрос: Блокировки чтения / записи в C++

Что бы вы ни решили использовать, сравните 9X_cxx свою рабочую нагрузку с простыми блокировками, поскольку 9X_threading блокировки чтения / записи обычно в 3-40 9X_multi-threaded раз медленнее, чем простой мьютекс, когда 9X_c++ нет конфликта.

Вот some reference

16
1

  • ссылки недействительны<p><sp ...

Ответ #5

Ответ на вопрос: Блокировки чтения / записи в C++

Изменить: ссылка на журнал MSDN больше не 9X_cross-threading доступна. Статья CodeProject теперь доступна 9X_threading на https://www.codeproject.com/Articles/32685/Testing-reader-writer-locks и довольно хорошо подводит итог. Также 9X_c++ я нашел новую ссылку MSDN о Compound Synchronisation Objects.

В MSDN есть 9X_multithreading article о блокировках чтения и записи, в котором 9X_thread представлены некоторые их реализации. Он 9X_cpp также вводит Slim reader / writer lock, примитив 9X_multithread синхронизации ядра, представленный в Vista. Также 9X_threading есть CodeProject article о сравнении различных реализаций (включая 9X_thread те, которые описаны в статье MSDN).

10
0

Ответ #6

Ответ на вопрос: Блокировки чтения / записи в C++

C++ 17 поддерживает std::shared_mutex. Он поддерживается 9X_threading в MSVC++ 2015 и 2017.

9
0

Ответ #7

Ответ на вопрос: Блокировки чтения / записи в C++

Строительные блоки Intel Thread также предоставляют 9X_thread несколько вариантов rw_lock:

http://www.threadingbuildingblocks.org/

У них есть spin_rw_mutex 9X_lock для очень коротких периодов конкуренции 9X_multithreading и queueing_rw_mutex для более длительных 9X_thread периодов конкуренции. Первый может использоваться 9X_locking в коде, особенно чувствительном к производительности. Последний 9X_threads более сопоставим по производительности с 9X_cpp Boost.Thread или прямым использованием pthreads. Но 9X_cpp профилируйте, чтобы убедиться, какой из 9X_multithread них лучше всего подходит для ваших шаблонов 9X_locking доступа.

4
1

  • Вместо того, чтобы выбирать вариант, основанный на «особо чувствительном к производительности коде», выбор должен основываться на средней продолжительности удержания блокировки. Есл ...

Ответ #8

Ответ на вопрос: Блокировки чтения / записи в C++

Я могу порекомендовать ACE library, который предоставляет 9X_lock множество механизмов блокировки и портирован 9X_threads на различные платформы.

В зависимости от 9X_cxx граничных условий вашей проблемы вам могут 9X_multi-threaded быть полезны следующие классы:

  • ACE_RW_Process_Mutex
  • ACE_Write_Guard и ACE_Read_Guard
  • ACE_Condition

3
0

Ответ #9

Ответ на вопрос: Блокировки чтения / записи в C++

Boost.Thread начиная с версии 1.35.0 уже поддерживает 9X_c++ блокировки чтения и записи. Хорошая вещь 9X_lock в этом заключается в том, что реализация 9X_c++ является кроссплатформенной, проходит экспертную 9X_multi-threaded оценку и на самом деле является a reference implementation for the upcoming C++0x standard.

3
1

  • Да, почти - но Boost.Thread, являющийся основой потоковой пе ...

Ответ #10

Ответ на вопрос: Блокировки чтения / записи в C++

http://www.codeproject.com/KB/threads/ReaderWriterLock.aspx

Вот хорошая и легкая реализация, подходящая 9X_lock для большинства задач.

2
0

Ответ #11

Ответ на вопрос: Блокировки чтения / записи в C++

Класс блокировки синхронизации с несколькими 9X_threads устройствами чтения и одной записью для 9X_cross-threading Win32, автор - Гленн Слейд

http://www.glennslayden.com/code/win32/reader-writer-lock

2
0