Блокировки чтения / записи в C++
Я ищу хорошую блокировку чтения / записи 9X_threads на C++. У нас есть вариант использования 9X_multi-threaded одного нечастого писателя и множества частых 9X_thread читателей, и мы хотели бы оптимизировать 9X_multithread его для этого. Я бы предпочел кроссплатформенное 9X_cxx решение, но подойдет только Windows.
Ответ #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;
Ответ #2
Ответ на вопрос: Блокировки чтения / записи в C++
Более новые версии boost::thread имеют блокировки чтения 9X_multi-threaded / записи (1.35.0 и более поздние версии, очевидно, предыдущие 9X_thread версии работали некорректно).
У них есть 9X_multi-threaded имена shared_lock
, unique_lock
и upgrade_lock
, и они работают с shared_mutex
.
- Мы на 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
везде.
- Мне любопытно, почему вы повторно реализовали блокировку pthread_rwlock_ (rd / wr) (un) поверх p ...
Ответ #4
Ответ на вопрос: Блокировки чтения / записи в C++
Что бы вы ни решили использовать, сравните 9X_cxx свою рабочую нагрузку с простыми блокировками, поскольку 9X_threading блокировки чтения / записи обычно в 3-40 9X_multi-threaded раз медленнее, чем простой мьютекс, когда 9X_c++ нет конфликта.
Вот some reference
- ссылки недействительны<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).
Ответ #6
Ответ на вопрос: Блокировки чтения / записи в C++
C++ 17 поддерживает std::shared_mutex
. Он поддерживается 9X_threading в MSVC++ 2015 и 2017.
Ответ #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 доступа.
- Вместо того, чтобы выбирать вариант, основанный на «особо чувствительном к производительности коде», выбор должен основываться на средней продолжительности удержания блокировки. Есл ...
Ответ #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
Ответ #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.
- Да, почти - но Boost.Thread, являющийся основой потоковой пе ...
Ответ #10
Ответ на вопрос: Блокировки чтения / записи в C++
http://www.codeproject.com/KB/threads/ReaderWriterLock.aspx
Вот хорошая и легкая реализация, подходящая 9X_lock для большинства задач.
Ответ #11
Ответ на вопрос: Блокировки чтения / записи в C++
Класс блокировки синхронизации с несколькими 9X_threads устройствами чтения и одной записью для 9X_cross-threading Win32, автор - Гленн Слейд
http://www.glennslayden.com/code/win32/reader-writer-lock
-
10
-
4
-
4
-
4
-
8
-
2
-
8
-
1
-
3
-
4
-
1
-
5
-
11
-
9
-
8
-
15
-
6
-
4
-
22
-
6
-
6
-
4
-
4
-
10
-
5
-
8
-
5
-
6
-
9
-
4
-
3
-
9
-
4
-
7
-
8
-
3
-
2
-
5
-
5
-
3
-
8
-
4
-
2
-
3
-
4
-
4
-
4
-
4
-
5
-
1