這個問題是關於在工作線程中使用單例對象的getter方法。下面是一些僞代碼第一:單線程工人方法中的單例getInstance
// 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方法(所有隻讀),邁德特::的getInstance(),邁德特::的getValue()和邁德特:: getData1() 。第一個問題是這些方法的線程安全性如何?
因爲它們通常被稱爲方法,所以使用互斥鎖來保護這些方法是我想要避免的。
第二個問題是:在多線程應用程序中,特別是在工作方法中,從中央源讀取數據的建議方式是什麼。
謝謝!
保羅
你不需要鎖定,只是因爲witting。如果寫入是非原子的,則只需要一個鎖。整數寫入是原子的。如果某事必須編寫2個整數來保持一致的狀態,那麼您將需要一個鎖來確保在任何人讀取對象之前更新這兩個整數。 – 2008-11-07 14:58:47
詮釋賦值不保證是原子... – user23167 2008-11-07 17:38:55