当前位置:  开发笔记 > 编程语言 > 正文

线程工作者方法中的Singleton getInstance

如何解决《线程工作者方法中的SingletongetInstance》经验,为你挑选了1个好方法。

这个问题是关于在工作线程中使用单个对象的getter方法.这是一些伪代码:

// Singleton class which contains data
class MyData
{
    static MyData* sMyData ;

    int  mData1[1024];
    int  mData2[1024];
    int  mData3[1024];

    MyData* getInstance()
    {
        // sMyData is created in the very beginning.
        return sMyData ;
    }

    void getValues(int idx, int& data1,int& data2,int& data3)
    {
        data1 = mData1[idx];
        data2 = mData2[idx];
        data3 = mData3[idx];
    }

    int* getData1()
    {
        return &mData1[0];
    }
}

class MyThread
{
    void workerMethod()
    {
        MyData* md = MyData::getInstance();

        int d1,d2,d3;
        md->getValue( 12, d1,d2,d3 );

        int* data1 = md->getData1();
        d1 = data1[34];
    }
}

现在你看到我有一些getter方法(所有只读),MyData :: getInstance(),MyData :: getValue()和MyData :: getData1().第一个问题是这些方法的线程安全性如何?

由于它们通常被称为方法,因此我应该避免使用互斥锁来保护这些方法.

第二个问题是:在多线程应用程序中从中央源读取数据的建议方法是什么,特别是在工作方法中.

谢谢 !

保罗



1> DavidK..:

如果没有其他线程会尝试写入单例对象中的数据,则不需要保护它们:根据定义,在没有编写器的情况下,多个读取器是线程安全的.这是一种常见的模式,程序的初始化代码设置一个单例,然后只能由工作线程读取.

但是,如果任何线程曾经有的则从中读取写入这些数据,你必须以某种方式保护它.如果你有很多读者而只有偶尔的作家,那么值得考虑某种"读写"锁定,它可以在没有任何作者的情况下允许多个读者.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有