我在寫一個需要同時支持易失性和非易失性實例的類(易失性實例使用原子操作,非易失性實例使用常規操作),並且想知道如果我我正在以正確的方式去解決它。下面是類聲明的SNIPPIT至今:爲易失性和非易失性實例重載類
class Yield {
public:
Yield();
Yield(Yield const &other);
Yield(Yield const volatile &other);
Yield &operator=(Yield const &other);
Yield &operator=(Yield const volatile &other);
Yield &operator+=(Yield const &other);
Yield &operator+=(Yield const volatile &other);
Yield volatile &operator+=(Yield const &other) volatile;
Yield volatile &operator+=(Yield const volatile &other) volatile;
// Other operators snipped...
};
問題1:當MSVC編譯,我得到以下警告:
warning C4521: 'util::Yield' : multiple copy constructors specified
該警告預示着任何問題使用這個類?還是可以安全地忽略它?
問題2:就目前而言,所有操作符都會因爲volatile和non-volatile
other
參數而被重載。我認爲這是必要的,以避免對非易失性實例進行較慢的易失性訪問?是否有替代方案允許每種方法只能被編碼兩次(易失性1小時和非易失性1小時)而不是4次(易失性和非易失性1小時,每種都有易失性和非易失性右旋糖)?
我希望把這些問題放在一起是好的,否則請留下評論,我可以將它們分開。 謝謝!
是的,我知道易失性不會自動提供安全的多線程,我只是想用它來區分需要原子操作(何時共享實例)和何時不(實例僅在本地使用)。不必多次複製代碼將是很好的,但到目前爲止其他的變化例如使用模板更加醜陋。 – zennehoy
'volatile'不提供任何多線程功能,也不提供任何原子性。考慮命名你的函數_atomic或類似的東西,而不是使用'volatile''這個',這樣讀取你的代碼的人可以告訴它做了什麼。 –