pthread 互斥锁定和解锁每个变量

pthread mutex lock and unlock per variable

我想知道使用在线程之间共享的对象锁定和解锁变量互斥锁的最佳做法是什么。

这就是我一直在做的事情,到目前为止似乎工作得很好,只是想知道这是否过度:

class sharedobject
{
private:
    bool m_Var1;

    pthread_mutex_t var1mutex;

public:
    sharedobject()
    {
        var1mutex = PTHREAD_MUTEX_INITIALIZER;
    }

    bool GetVar1()
    {
        pthread_mutex_lock(&var1mutex);
        bool temp = m_Var1;
        pthread_mutex_unlock(&var1mutex);
        return temp;
    }

    void SetVar1(bool status)
    {
        pthread_mutex_lock(&var1mutex);
        m_Var1 = status;
        pthread_mutex_unlock(&var1mutex);
    }
};

这不是我的实际代码,但它显示了我如何为在线程之间的对象中共享的每个变量使用互斥锁。我没有整个对象的互斥量的原因是因为一个线程可能需要几秒钟才能完成对部分对象的操作,而另一个线程检查对象的状态,然后另一个线程再次从对象获取数据

我的问题是,为线程间访问的对象中的每个变量创建一个互斥锁,然后在读取或写入该变量时锁定和解锁该变量是否是一个好习惯?

我对要检查状态的变量使用 trylock(因此我不会在处理变量时创建额外的线程,也不会让程序等待获取锁)

我在线程方面的工作经验不多。我想让程序线程安全,但它也需要尽可能地执行。

如果你保护的成员是可读写的,并且随时可能被多个线程访问,那么你所做的并不过分——这是必要的。

如果你能证明一个成员不会改变(是不可变的)那么就没有必要用互斥锁来保护它。

许多人更喜欢多线程解决方案,其中每个线程都有一个不可变的数据副本,而不是许多线程访问同一副本的解决方案。这消除了对内存屏障的需求,并且通常可以提高执行时间和代码安全性。

您的里程可能会有所不同。