gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:27 31 4
gpt4 key购买 nike

这个问题是关于在工作线程中使用单例对象的 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com