Pau*_*mer 1 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];
}
}
Run Code Online (Sandbox Code Playgroud)
现在你看到我有一些getter方法(所有只读),MyData :: getInstance(),MyData :: getValue()和MyData :: getData1().第一个问题是这些方法的线程安全性如何?
由于它们通常被称为方法,因此我应该避免使用互斥锁来保护这些方法.
第二个问题是:在多线程应用程序中从中央源读取数据的建议方法是什么,特别是在工作方法中.
谢谢 !
保罗
如果没有其他线程会尝试写入单例对象中的数据,则不需要保护它们:根据定义,在没有编写器的情况下,多个读取器是线程安全的.这是一种常见的模式,程序的初始化代码设置一个单例,然后只能由工作线程读取.
但是,如果任何线程曾经有的则从中读取写入这些数据,你必须以某种方式保护它.如果你有很多读者而只有偶尔的作家,那么值得考虑某种"读写"锁定,它可以在没有任何作者的情况下允许多个读者.