【问题标题】:How to handle shared resources with pthread mutex如何使用 pthread mutex 处理共享资源
【发布时间】:2017-01-27 02:32:27
【问题描述】:

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

如果有共享标志,我们称之为 (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);
        }
    }

【问题讨论】:

    标签: locking pthreads mutex unlock shared-resource


    【解决方案1】:

    你可以使用single-writer-multiple-readers idiom。

    阅读:

    pthread_rwlock_rdlock(&rwlock);
    

    写作:

    pthread_rwlock_wdlock(&rwlock);
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-02-07
        • 1970-01-01
        • 2014-02-03
        • 2021-02-10
        • 2014-11-28
        • 1970-01-01
        • 2021-11-25
        • 2021-10-10
        • 2015-10-27
        相关资源
        最近更新 更多