編輯:ST不允許爲新手發佈兩個以上的鏈接。抱歉缺少參考。使用Cache-Line對齊方式在C中修改全局共享狀態的無鎖檢查
我試圖減少C應用程序檢測全局狀態變化的性能相關的鎖定開銷。儘管最近我在這個主題上閱讀了很多內容(例如H. Sutter等等),但我對自己的實施沒有信心。我想使用CAS類似的操作和DCL的組合來檢查全局變量,從而避免虛假共享,以便從多個線程之間共享的數據更新線程本地數據時檢查全局變量的高速緩存行對齊。我的信心不足的主要原因是
- 我無法解釋在Type-Attributes
- 我似乎沒有能夠找到任何文學和例子,我可以很容易地轉換爲C,如aligning- GNU的文檔(儘管似乎回答我的問題有點我對我的執行沒有信心)
- 我對C的經驗是有限公司
我的問題:
該類型的屬性文檔狀態:
該屬性指定一個最小對齊(以字節計)爲指定 類型的變量。例如,聲明:
(請參見聲明類型的屬性的文檔)
力編譯器,以確保(只要它可以)中,每個可變其類型是
struct S
或more_aligned_int
將被分配並至少在一個8-byte
邊界上對齊。在 SPARC中,將struct S
類型的所有變量對齊到8-byte
的邊界允許 編譯器在將一個類型爲struct S的變量 複製到另一個時使用ldd和std(雙字加載和存儲)指令,從而提高運行時效率。這是否意味着的
struct S
或more_aligned_int
開始將始終對準8-byte
邊界?這並不意味着數據將被填充爲恰好使用64個字節,對吧?假設1。誠然,
struct cache_line_aligned
每個實例(見下文代碼實施例1)對準上64-byte
邊界和利用正好一個高速緩存行(假定高速緩存行的長度是64 bytes
)使用
typedef
的類型聲明不改變的__attribute__ ((aligned (64)))
語義(見下文代碼實施例2)實例化結構時,如果結構與
__attribute__ ...
聲明我不需要使用
// Example 1
struct cache_line_aligned {
int version;
char padding[60];
} __attribute__ ((aligned (64)));
// Example 2
typedef struct {
int version;
// place '__attribute__ ((aligned (64)))' after 'int version'
// or at the end of the declaration
char padding[60];
} cache_line_aligned2 __attribute__ ((aligned (64)));
最後使用高速緩存行排列的方法來有效地檢查,如果全局狀態已被其他線程修改函數的草圖:
void lazy_update_if_changed(int &t_version, char *t_data) {
// Assuming 'g_cache_line_aligned' is an instance of
// 'struct cache_line_aligned' or 'struct cache_line_aligned2'
// and variables prefixed with 't_' being thread local
if(g_cache_line_aligned.version == t_version) {
// do nothing and return
} else {
// enter critical section (acquire lock e.g. with pthread_mutex_lock)
t_version = g_cache_line_aligned.version
// read other data that requires locking where changes are notified
// by modifying 'g_cache_line_aligned.version', e.g. t_data
// leave critical section
}
}
很抱歉的長期職位。
謝謝!
乾杯!這已經很好地闡明瞭一些事情。我沒有想過用sizeof來檢查對齊!我會記住這一個。那麼動態分配的對齊結構呢? 'aligned_malloc'會完成這項工作嗎? – instilled
它可能會。閱讀其文檔以確保。 –
當然!會這樣做。再次感謝您的出色答案。 – instilled