Как работать с общими ресурсами с помощью pthread mutex
У меня вопрос по поводу мьютекса и pthreads.
Если есть общий флаг, давайте его назовем (F1). И есть несколько потоков. Но только один поток (T1) может поднимать / прекращать флаг, а все остальные потоки (T2..Tn) только читают или извлекают статус.
Достаточно ли, если T1 использует mutex_lock/mutex_unlock, когда флаг F1 будет установлен с новым значением? Должны ли все другие потоки также использовать mutex_lock/mutex_unlock, даже если они будут только читать статус из F1?
Exemple1:
T1()
{
while(Running)
{
pthread_mutex_lock(&lock);
F1 = true;
pthread_mutex_unlock(&lock);
}
}
T2()
{
while(Running)
{
if(F1) {
/* Do something */
}
}
}
Exemple2:
T1()
{
while(Running)
{
pthread_mutex_lock(&lock);
F1 = true;
pthread_mutex_unlock(&lock);
}
}
T2()
{
while(Running)
{
pthread_mutex_lock(&lock);
if(F1) {
/* Do something */
}
pthread_mutex_unlock(&lock);
}
}
2 ответа
Вы можете использовать идиому "один писатель-несколько читателей".
Чтение:
pthread_rwlock_rdlock(&rwlock);
Пишу:
pthread_rwlock_wdlock(&rwlock);
Если ваш вариант использования такой же простой, как пример, который вы опубликовали, вы можете рассмотреть версию без блокировки, включающую атомарные флаги.
В рамках модели pthreads читатели должны также выполнить операцию синхронизации. Это может быть pthread_mutex_lock()
/ pthread_mutex_unlock()
пара в читателях и писателях, как вы описали, или в качестве альтернативы предложение Metalfox о блокировке читателя-писателя.