色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

11中的atomic

李中冰2年前19瀏覽0評論

11中的atomic?

首先是:x86匯編中,對任何內(nèi)存地址中的1byte的讀永遠是原子的.也就是說對一個char的讀取永遠是原子的,對內(nèi)存地址對齊2byte的int16類型的讀取是原子的,對4byte對齊的int32類型讀取是原子的,從從奔騰開始,對8byte對齊地址的int64讀取是原子的.所以如果你用的是匯編,保證這些就行了.但C/C++中又是另一番情景:C/C++中,編譯器保證基礎(chǔ)類型的內(nèi)存對齊,例如保證double類型的對齊是8(或者4,忘了),即使是malloc出來的也可以保證對齊.但是由于各種不可避免的指針轉(zhuǎn)換,例如 char a[4],float* p=(float*)a的存在,使得對齊的保證基本名存實亡.而且,當(dāng)一個比較長的類型,例如double被編譯器放入寄存器的時候,C++標準根本不保證只用一條指令就將它放入一個寄存器中.例如我可以先把前半部分放入eax,等一會兒再把后半部分放入edx等等.不過,如果你能夠確保對齊,那么大多數(shù)情況下雖然UB,但你的代碼還是有可能正常工作的.再然后,其實上面說的根本不用考慮,因為在C/C++標準中,一個變量除了使用atomic相關(guān)的函數(shù)以外,任何多線程同時進行的讀寫實際上都是UB.所以,除非使用標準中的atomic功能,或者使用編譯器自帶的一些擴展,例如InterlockedAdd之類的,否則都是bug的隱患.例如,有非常多的開O2以上優(yōu)化就出錯的多線程相關(guān)代碼就是由于類似的原因?qū)е碌?一個很經(jīng)典的例子就是一個網(wǎng)上流傳的很廣的C++的單例類,以下是那段代碼:

這個雙檢鎖的代碼很可能不能正常工作,因為首先是編寫者沒有告知編譯器必須假設(shè)instance是可能被其他線程改變的,因此編譯器完全可以認為兩次if只保留一個就行了(當(dāng)然也可能不會).因此首先instance必須改為volatile的,然后就是上面所說的原子性,instance應(yīng)該改為atomic<Singleton*>.C/C++中變量的原子性其實是個巨大的坑,C++11和C11之前對多線程的問題幾乎只字不提,也沒有語言層面對原子性的保證,(上文中那段單例的代碼應(yīng)該也是C11之前出現(xiàn)的).所以程序員也沒有更好的辦法,只能使用GCC和VC里自帶的那堆原子操作,或者懶了就直接不考慮這問題了.因此只能寫這種有隱含問題的代碼,現(xiàn)在沒問題了,大膽用atomic<>吧.

java int 原子,11中的atomic