mutexy - shared, recursive, zwykłe, który wybrać

0

Mam mapę map<string, map<string, string>> mapa
Mapę chcę opakować w jakiejś klasie, która będzie umożliwiała pracę na takiej mapie wielu wątkom. Jaki mutex zastosować by np. po pobraniu mapa.at("klucz") wątek mógł pracować na pobranej mapie tak by nie było zagrażenia, że w tym samym czsie inny wątek nie wywali mi tej mapy z głównej mapy i abym jednocześnie mógł pisać/czytać z wartości drugiej mapy i je dodawać/usuwać?

2

Istnieje duża szansa, że masz problem z designem i wcale nie potrzebujesz muteksów, wątków itd. Co chcesz zrobić?

Odnośnie pytania: jeśli chcesz mieć pewność, że obiekt nie zniknie - trzymaj shared_ptry w zewnętrznej mapie, wtedy nawet jeśli element zostanie z niej usunięty to wątek pracujący na tym elemencie dokończy działanie.

0

Ponadto, jeśli faktycznie potrzebujesz, żeby ta mapa była współdzielona między wątkami, to czemu mutexy? Zastanów się nad sekcją krytyczną. Jest szybsza i lżejsza. Krótko mówiąc, mutexy wtedy, gdy ma być współdzielone między procesami. Sekcje krytyczne w zupełności wystarczą do wątków. Przy czym, zaznaczam że dll jest ładowany do procesu aplikacji, a więc to jest cały czas jeden proces.

0

Potrzeba jest następująca:

Jest sobie mapa z id'kami sesji mapowanymi na mapy z id'kami userow mapowanymi na kontekst danego usera.
Czyli w jednej "sesji" moze byc kilku userow. Kazdy user jest obslugiwany przez jeden watek z puli i np. moze byc sytuacja, ze watek pracuje na konkretnym userze a w tym czasie inne watki pousuwaja w ogole cala sesje.

Wydaje mi się, że podejście z shared_ptr ma sens + oczywiście std::mutex na każdym z poziomów mapowań.
Czy to dobre podejście będzie ?
Jeżeli chodzi o sekcje krytyczne to są jakieś rozwiązania z stla ??

0

Jescze w temacie wspomnianych sekcji krytycznych, to nie do konca rozumiem co autor mial na myśli, bo sekcja krytyczna to zjawisko któremu mutexy właśnie pomagają zapobiegać

0

Nie, mutexy pomagają zapobiegać temu samemu zjawisku któremu zapobiegają sekcje krytyczne. Tylko muteksów się używa do pewnych problemów, a sekcji krytycznych do innych. Nie ma niczego takiego w STL, bo sekcje krytyczne są z WinAPI. Więc jeśli Ci to nie przeszkadza, to napisanie klasy w stylu ScopeCriticalSection to jest dosłownie 5 minut roboty. I to z przerwą na kawę ;)

0

aaa teraz mam, dzięki, ale chce mieć przenośny kod, mimo wszystko chętnie poczytam o tym

0

Jeśli wątek A może usunąć dane, na których pracuje wątek B to raczej masz spieprzony design. Ja bym się starał doprowadzić do tego, aby tylko jeden wątek w ogóle działał na tej Twojej mapie, a z innymi komunikował się za pomocą z góry ustalonych komunikatów.

W przeciwieństwie do tego co mówi @Juhas, wymyślanie koła na nowo nie jest pożądane poza warunkami edukacyjnymi. Użyj std::mutex i std::lock_guard.

1 użytkowników online, w tym zalogowanych: 0, gości: 1