线程安全访问成员变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全访问成员变量相关的知识,希望对你有一定的参考价值。

所以我有一个类,它以类对象作为参数生成一个线程。然后在线程中我调用一个成员函数。我使用Critical_Sections进行同步。

那么实现是线程安全的吗?因为只有成员是线程安全的而不是类对象。

    class TestThread : public CThread
    {
    public:
        virtual DWORD Work(void* pData) // Thread function
        {
            while (true)
            {
                if (Closing())
                {
                    printf("Closing thread");
                    return 0;
                }

                Lock();   //EnterCritical
                threadSafeVar++;
                UnLock(); //LeaveCritical

            }
        }

        int GetCounter()
        {
            int tmp;
            Lock();   //EnterCritical
            tmp = threadSafeVar;
            UnLock(); //LeaveCritical

            return tmp;
        }

    private:
        int threadSafeVar;
    };

.
.
.

    TestThread thr;

    thr.Run();

    while (true)
    {
        printf("%d
",thr.GetCounter());
    }
答案

您的实现是线程安全的,因为您已使用互斥锁保护您对属性的访问权限。

这里,你的类是一个线程,所以你的对象是一个线程。这是你在线程中所做的,它告诉它是否是线程安全的。

您可以通过锁定/解锁系统获得价值,并使用相同的系统进行编写。所以你的函数是线程安全的。

另一答案

如果该成员是您的关键部分,您应该只锁定对它的访问权限。

顺便说一下,你可以实现一个像以下的储物柜:

class Locker
{
    mutex &m_;

 public:
    Locker(mutex &m) : m_(m)
    {
      m.acquire();
    }
    ~Locker()
    {
      m_.release();
    }
};

你的代码看起来像:

mutex myVarMutex;
...
{
    Locker lock(myVarMutex);
    threadSafeVar++;
}
...
int GetCounter()
{
    Locker lock(myVarMutex);
    return threadSafeVar;
}

以上是关于线程安全访问成员变量的主要内容,如果未能解决你的问题,请参考以下文章

多线程访问成员变量与局部变量

Servlet和Struts2的线程安全问题

58synchronized同步方法

为什么原生的servlet是线程不安全的而Struts2是线程安全的?

java多线程执行任务,处理共享成员变量的安全问题

Java中,对多线程访问同一变量(并发访问)的认识