2013-08-07 28 views
5

Tại sao kích thước lockfree tăng được cố định lên 65535 đối tượng?lý do tại sao tăng kích thước tự do lockfree được giới hạn tối đa là 65535 đối tượng?

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

Mã trên ném trường hợp ngoại lệ.

lý do tôi tìm thấy trong mã là các nhà tự do dựa trên mảng chỉ hỗ trợ không gian địa chỉ 16bit.

lý do cho việc này là gì? Tôi đang sử dụng nó trên máy Linux 64bit. thì tại sao giới hạn địa chỉ cho 2 ** 16 mục? hàng đợi có sử dụng 'short int' để lập chỉ mục không? sao các lệnh nguyên tử chỉ hoạt động với kích thước từ 16 bit?

Tôi nên làm gì để có hàng đợi có kích thước cố định với dung lượng lớn hơn số lượng này?

+0

tôi đã nhận xét mã trong freelist.hpp mà ném ngoại lệ nếu kích thước lớn hơn 65535, có vẻ như hoạt động tốt nhưng tôi không thấy cải thiện nhiều về hiệu suất: ( – weima

+5

65535 là kích thước tối đa của 'unsigned short', có thể nó có một cái gì đó để làm với rằng –

+0

@IosifM., bạn là đúng.Tôi thấy rằng có một lớp được gọi là tagged_index trong đó sử dụng hai biến 16 bit, và cùng nhau này trở thành một biến 32 bit được reintrpreted được sử dụng như một chỉ mục. và kể từ khi nó sử dụng hoán đổi nguyên tử, nó sử dụng 32bits cho điều đó.Nhưng câu hỏi của tôi vẫn còn lý do tại sao giới hạn nó đến 16? Nếu làm cho nó 32 bit và vẫn còn nguyên tắc hướng dẫn có thể làm việc – weima

Trả lời

2

Tăng cường triển khai danh sách lockfree phải chống lại số ABA problem. Cách giải quyết phổ biến là thêm tag bit vào số lượng đang được xem xét. Hơn nữa, Boost phải chạy trên kiến ​​trúc 32 bit, điều này có nghĩa chỉ các giá trị 32 bit có thể được điều khiển một cách nguyên tử.

Và nếu chúng tôi chia giá trị 32 bit, chúng tôi có thể lưu trữ con trỏ 16 bit và thẻ 16 bit. Giá trị 16 bit chưa ký được giới hạn ở 65535 giá trị khác nhau.

+0

Cảm ơn @Sergey. if tôi biết tôi phải sử dụng nó trên kiến ​​trúc 64 bit, làm cách nào để sửa đổi nguồn? chỉ cần thay đổi thẻ tagged_index :: tag_t và index_t thành ba trong unin32_t? – weima

+0

Câu hỏi ban đầu của bạn sẽ hỏi "tại sao" chứ không phải "cách khắc phục". Tôi không biết cách sửa nó. –

+0

ok. tôi sẽ thêm một câu hỏi khác cho cùng. – weima

Các vấn đề liên quan