如何使用pthread互斥锁处理共享资源

时间:2016-09-19 11:52:30

标签: locking pthreads mutex unlock shared-resource

我对mutex和pthreads有疑问。

如果有共享标志,请调用它(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);
        }
    }

2 个答案:

答案 0 :(得分:1)

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

读:

pthread_rwlock_rdlock(&rwlock);

写作:

pthread_rwlock_wdlock(&rwlock);

如果您的用例与您发布的示例一样简单,您可以考虑使用涉及原子标记的无锁版本。

答案 1 :(得分:1)

在pthreads模型下,读者也需要执行同步操作。这可以是您所描述的读者和作者中的pthread_mutex_lock() / pthread_mutex_unlock()对,也可以是读者 - 作者锁定的metalfox's suggestion