2013-08-07 38 views
5

爲什麼升壓無鎖尺寸固定爲65535個物體?爲什麼增強無鎖定freelist大小限制爲最多65535個對象?

typedef boost::lockfree::queue<int, boost::lockfree::fixed_size<true>> MyQueue; 
MyQueue queue(1024*100); 

上面的代碼會拋出異常。

我在代碼中發現的推理是基於數組的freelist只支持16位地址空間。

這是什麼原因?我在64位Linux機器上使用它。那麼爲什麼限制尋址2 ** 16項目?該隊列是否使用'short int'進行索引?原子指令是否僅適用於16位字長?

我應該怎麼做才能擁有比此容量更大的固定大小的隊列?

+0

我評論中freelist.hpp會拋出異常,如果大小超過65535的代碼,它似乎工作正常,但我沒有看到在性能上有較大提升:( – weima

+5

65535是一個無符號'的short'的最大尺寸,也許它有事情做與 –

+0

@IosifM,你是對的。我看到有一類叫做tagged_index使用兩個16位變量,和在一起這成爲其reintrpreted用作索引的32位變量。並且,因爲它使用原子交換,它使用針對32位,但我的問題仍然存在,爲什麼它限制在16,如果讓32位,並且仍原子指令可以工作 – weima

回答

2

無鎖列表的提升實施必須與ABA problem作鬥爭。一個常見的解決方法是將額外的tag位添加到正在考慮的數量中。此外,Boost必須運行在32位體系結構上,這意味着只有32位值可以被原子操縱。

如果我們分割32位值,我們可以存儲16位指針和16位標籤。無符號16位值限制爲65535個不同的值。

+0

感謝@Sergey。如果我知道我必須在64位體系結構上使用它,我如何修改源代碼?只需將tagged_index :: tag_t和index_t更改爲基於unin32_t的ba? – weima

+0

您的原始問題是「爲什麼」而不是「如何修復」。我不知道如何解決它。 –

+0

好的。我會爲此添加另一個問題。 – weima

相關問題