Как работать с общими ресурсами с помощью 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 о блокировке читателя-писателя.

Другие вопросы по тегам