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.
@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ử. –
@AlexChamberlain là một điểm tuyệt vời, thưa ngài. Tôi sẽ yank liên kết. – WhozCraig
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