1

我有一个关于互斥锁和 pthread 的问题。

如果有共享标志,我们称之为 (F1)。并且有多个线程。但只有一个线程 (T1) 可以提高/停止标志,所有其他线程 (T2..Tn) 只能读取或拉取状态。

当标志 F1 将被设置为新值时,如果 T1 使用 mutex_lock/mutex_unlock 就足够了吗?所有其他线程是否也应该使用 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);
        }
    }
4

2 回答 2

1

您可以使用单作者多读者习语。

阅读:

pthread_rwlock_rdlock(&rwlock);

写作:

pthread_rwlock_wdlock(&rwlock);

如果您的用例与您发布的示例一样简单,您可能会考虑使用包含原子标志的无锁版本。

于 2016-09-19T16:12:56.517 回答
1

在 pthreads 模型下,读者需要执行同步操作。正如您所描述的,这可以是读取器和写入器中的pthread_mutex_lock()/pthread_mutex_unlock()对,也可以是metalfox对读取器-写入器锁的建议。

于 2016-09-20T03:48:45.290 回答