每个变量

时间:2015-10-28 19:16:00

标签: c++ multithreading pthreads mutex

我想知道在线程之间共享对象的变量锁定和解锁互斥锁的最佳实践。

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

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);
    }
};

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

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

我对变量使用trylock我正在检查状态(所以我在处理变量时不创建额外的线程,并且不要让程序等待获得锁定)

我没有很多使用线程的经验。我想让程序线程安全,但它也需要尽可能地执行。

1 个答案:

答案 0 :(得分:1)

如果您保护的成员是可读写的,并且可以通过多个线程随时访问,那么您所做的事情并不过分 - 这是必要的。< / p>

如果您可以证明成员不会更改(不可变),则无需使用互斥锁保护它。

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

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