挑戰
確保每個同步變量都獨自位於一個高速緩存行上。 正如我們在
如何避免錯誤共享 中所討論的那樣,當將同步結構拉伸至高速緩存行的大小後,必須確保同步結構在高速緩存邊界上對齊。
解決方案
利用下面給出的適當編碼技術,將數據結構在高速緩存邊界上對齊。 將同步結構拉伸爲高速緩存行的大小並不能說是完全大功告成。您還需確保同步結構在高速緩存邊界上對齊。同步變量不能與另一個同步結構位於相同的高速緩存行上,如果同步結構沒有在高速緩存邊界上對齊,則同步變量無法獨自位於一個高速緩存行上。可以採用下面兩種技術中的一種來執行對齊。
針對動態內存,採用如下代碼片斷:
struct syn_str { int s_variable; };
void *p = malloc ( sizeof (struct syn_str) + 127 );
syn_str * align_p = (syn_str *)( (((int) p) + 127) & -128 );
|
當使用英特爾 C/C++ 編譯器時,也可採用下面的代碼片斷:
_declspec(align(128)) struct syn_str aligned_structure;
|
欲瞭解這些代碼片斷的更多內容,以及它們在實際情形中的使用,請參閱本主題 "資料來源" 中引用的應用註釋。
資料來源