c++ - 线程 worker 方法中的单例 getInstance

标签 c++ multithreading

这个问题是关于在工作线程中使用单例对象的 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()。第一个问题是这些方法的线程安全性如何?

因为它们是经常被调用的方法,所以我试图避免使用互斥锁来保护这些方法。

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

谢谢!

保罗

最佳答案

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

但是,如果任何线程曾经写入此数据而其他线程正在读取它,则您必须以某种方式保护它。如果您有很多读者而只有偶尔的作者,则值得考虑某种“读写”锁,它允许多个读者在没有任何作者的情况下。

关于c++ - 线程 worker 方法中的单例 getInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/271939/

相关文章:

c# - 启动线程时的不同行为 : ParameterizedThreadStart vs. 匿名委托(delegate)。为什么这有关系?

c++ - std::function 重载有类似的转换

c++ - Qt:何时使用继承与设置属性?

c++ - 多边形内的检查点

c++ - 为什么尽管只解决了一个项目,但所有 C++ 数组元素都得到了设置?

Ruby 线程安全线程创建

c# - 需要解释事件处理和委托(delegate)

c++ - GCC 警告已声明但 undefined variable

java - 这种行为背后的原因是什么(线程)

java - 多线程 Java - 同步 - 警告 Android Studio