2013-01-15 31 views
16

Chúng tôi đang phát triển một ứng dụng mạng dựa trên C/S, chúng tôi thấy có quá nhiều khóa thêm vào std :: map rằng hiệu suất của máy chủ trở nên kém.Có khả năng thực hiện bản đồ tự do khóa trong C++

Tôi tự hỏi liệu có thể thực hiện bản đồ không có khóa, nếu có, làm cách nào? Có mã nguồn mở nào không?

EDIT: Thực ra chúng tôi sử dụng sơ đồ :: lưu trữ thông tin ổ cắm, chúng tôi đã đóng gói dựa trên mô tả tệp ổ cắm để bao gồm một số thông tin cần thiết khác như địa chỉ ip, cổng, loại socket, tcp hoặc udp, v.v. .

để nói tóm lại, chúng ta có một bản đồ toàn cầu nói đó là

map<int fileDescriptor, socketInfor*> SocketsMap, 

sau đó mỗi chủ đề được sử dụng để gửi dữ liệu cần truy cập SocketsMap, và họ cần phải thêm mutex trước khi đọc từ SocketsMap hoặc bằng văn bản cho SocketsMap , do đó mức độ tương tranh của toàn bộ ứng dụng sẽ giảm đáng kể do o nhiều ổ khóa thêm vào SocketsMap.

Để tránh vấn đề về mức độ tương tranh, chúng tôi có hai giải pháp: 1. lưu trữ từng socketInfor * riêng biệt 2. sử dụng một số loại bản đồ không có khóa.

Tôi muốn tìm thấy một số loại bản đồ lock-free, vì các mã thay đổi theo yêu cầu của giải pháp này là ít hơn nhiều so với các giải pháp 1.

+0

@WhozCraig Trong tất cả sự công bằng, điều này đặc biệt nói C++ và cụ thể nói C ... Chúng là các ngôn ngữ rất khác nhau, đặc biệt khi bạn xem xét các biến nguyên tử. –

+0

@AlexChamberlain là một điểm tuyệt vời, thưa ngài. Tôi sẽ yank liên kết. – WhozCraig

+0

Nếu bạn cần một thùng chứa liên kết, nhưng không yêu cầu đặt hàng, nó có thể đơn giản hơn để sử dụng một băm như 'std :: unordered_map'. Nó có thể nhanh hơn ngay cả với khóa thô hiện tại của bạn (đặc biệt là nếu bạn có thể di chuyển bất kỳ tính toán băm đắt tiền nào bên ngoài phần bị khóa), nhưng tôi nghi ngờ một lần băm lại đắt tiền cũng đơn giản hơn để xử lý hơn một lần cân bằng lại. phiên bản lockfree. – Useless

Trả lời

14

Trên thực tế có một cách, mặc dù tôi đã không thực hiện nó bản thân mình có một bài báo trên lock free map using hazard pointers từ chuyên gia C++ nổi tiếng Andrei Alexandrescu.

+0

Xem thêm http://libcds.sourceforge.net/ –

+0

Lưu ý rằng các con trỏ nguy hiểm được cấp bằng sáng chế, vì vậy bạn có thể không sử dụng được mã này trong mã sản xuất. IPR có tuyệt vời không? –

+0

Cảm ơn. Tôi đã chỉnh sửa bài đăng để thêm thông tin, bạn có đề xuất thêm không? – Steve

1

Bạn có thể triển khai bản đồ bằng cách sử dụng optimistic design hoặc transactional memory. Cách tiếp cận này đặc biệt hiệu quả nếu cơ hội của hai hoạt động đồng thời giải quyết bản đồ và một thay đổi cấu trúc của nó là tương đối nhỏ - và bạn không muốn chi phí khóa mỗi lần.

Tuy nhiên, theo thời gian - va chạm sẽ xảy ra, và bạn sẽ phải kết quả bằng cách nào đó (thường là quay trở lại trạng thái ổn định cuối cùng và thử lại hoạt động).

Nếu phần cứng của bạn hỗ trợ đủ hoạt động nguyên tử - điều này có thể dễ dàng thực hiện với Compare And Swap (CAS) - nơi bạn thay đổi tham chiếu (và bất cứ khi nào bạn thay đổi bản đồ, bạn làm việc trên bản sao chứ không phải bản gốc và đặt nó làm tài khoản chính chỉ khi bạn cam kết).

2

HashMap sẽ phù hợp? Có một cái nhìn tại Intel Threading Building Blocks, họ có một bản đồ đồng thời thú vị. Tôi không chắc chắn nó không có khóa, nhưng hy vọng bạn quan tâm đến hiệu suất đa luồng tốt, không phải đặc biệt trong khóa-freeness.Ngoài ra bạn có thể kiểm tra CityHash lib

EDIT:

Trên thực tế bản đồ băm TBB được không lock-free

1

Tôi ngạc nhiên chưa ai đề cập đến nó, nhưng Nhấp Cliff đã thực hiện một wait-free hashmap in Java, mà tôi tin rằng có thể được chuyển đến C++,

2

Nếu bạn sử dụng C++ 11, bạn có thể có một cái nhìn tại AtomicHashMap của facebook/folly

+0

Điều này có lẽ không phải là những gì OP muốn. Bản đồ bạn đang liên kết đến không hoàn toàn không có khóa. Từ tài liệu: AHArray là khối liên tục có kích thước cố định của ô giá trị_type. Khi viết một ô, khóa sẽ bị khóa trong khi phần còn lại của bản ghi là được viết. –

2

Vâng, tôi đã thực hiện một Lock-Free Unordered Map (docs) bằng C++ sử dụng khái niệm "Danh sách chia theo thứ tự". Đó là vùng chứa tự động mở rộng và hỗ trợ hàng triệu thành phần trên CAS 64 bit mà không có vấn đề ABA. Hiệu suất khôn ngoan, đó là beast (xem trang 5). Đã là extensively tested với hàng triệu lượt chọn ngẫu nhiên.

+0

Điều này có vẻ đáng yêu. Tuy nhiên, nó dựa vào tiếng kêu dường như bị hỏng kể từ khi phát hành 3.4 (Tôi hiện đang ở trên 3.7). Nó không tìm thấy một hệ thống bao gồm tập tin. Tôi không có băng thông để nghiên cứu thêm. – Nicole

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