Блокировки чтения / записи в 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, автор - Гленн Слейд
-
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