Opracowujemy aplikację opartą na sieci C/S, stwierdziliśmy, że istnieje zbyt wiele blokad dodających do std :: map, że wydajność serwera stała się zła.Czy możliwe jest zaimplementowanie mapy wolnej od blokady w C++
Zastanawiam się, czy możliwe jest wdrożenie mapy bez blokady, jeśli tak, w jaki sposób? Czy jest tam jakiś kod open source?
EDYTOWANIE: Aktualnie używamy std :: map do przechowywania informacji o gniazdach, zrobiliśmy enkapsulację w oparciu o opis pliku gniazda w celu włączenia innych niezbędnych informacji, takich jak adres IP, port, typ gniazda, tcp lub udp, itp. .
aby Podsumowując, mamy globalną mapę mówią, że to
map<int fileDescriptor, socketInfor*> SocketsMap,
następnie każdy wątek, który jest używany do przesyłania danych musi mieć dostęp SocketsMap, a oni musieli dodać muteksu przed przeczytaniem od SocketsMap lub pisząc do SocketsMap , więc poziom współbieżności całej aplikacji znacznie spadłby z powodu s o wiele blokad dodawania do SocketsMap.
Aby uniknąć problemu z poziomem współbieżności, mamy dwa rozwiązania: 1. przechowuj każdy socketInfor * oddzielnie 2. używaj jakiejś mapy wolnej od blokady.
Chciałbym znaleźć jakieś wolne mapie zamka, ponieważ kody zmiany wymagane przez tego rozwiązania są znacznie mniejsze niż w przypadku rozwiązania 1.
@WhozCraig Podsumowując, mówi się w języku C++ i wyraźnie mówi ... Są to bardzo różne języki, szczególnie jeśli weźmiesz pod uwagę zmienne atomowe. –
@AlexChamberlain doskonały punkt, sir. Podniosę link. – WhozCraig
Jeśli potrzebujesz pojemnika asocjacyjnego, ale nie wymagasz zamawiania, może być łatwiej użyć skrótu typu 'std :: unordered_map'. Może być szybszy nawet przy obecnym zgrubnym blokowaniu (szczególnie, jeśli możesz przenosić dowolne kosztowne obliczenia haszowania poza zablokowaną częścią), ale podejrzewam, że czasami kosztowne ponowne szyfrowanie jest również łatwiejsze w obsłudze niż sporadyczne ponowne zrównoważenie, dla optymizmu. Wersja bez blokady. – Useless