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