bezpieczny wątkowo program z mapa

0

Cześć, mam pytanie czy to byłoby bezpieczne jeśli chodzi o zakleszczenia i wyścigi.

 
class obiekt_funkcyjny
{ 
    public:
        void operator()()
        {
            std::mutex_guard(m_mutex);
            zmien_wewnetrzny_stan_obiektu();
        }
    private:
       zmien_wewnetrzny_stan_obiektu(){jakies zmiany wewnetrzne;}
       stan_wewnetrzny;
       std::mutex m_mutex;
};

std::map<int,obiekt_funkcyjny*> mymap;
for(int i = 0 ; i < ilosc_funktorow ; ++i)
{ 
    mymap.insert( std::pair<int, obiekt_funkcyjny*>(i,new obiekt_funkcyjny) );
}

dalej watki wywoluja sobie z mapy te obiekty

Pytanie:
Czy dojdzie do tragedii ?

0

Zależy co rozumiesz przez tragedię. Jeśli wątki nie zmieniają mapy (uwaga: operator[] zmienia mapę jeśli klucz nie istnieje) to jest to do tragedii nie dojdzie, ale nie wygląda to na zbyt przemyślany design.

Przy okazji: używaj smart pointerów, nagie new/delete w nowym kodzie to zła praktyka.

0

Dzięki za odpowiedź, pomył mam taki:
kluczami w mapie sa id graczy(nr socketow), a wartosciami konteksty konkretnej gry dla tych graczy. Terazz gdy gracz cos tam chce z gra zrobic to z mapy po sockecie watek wywoluje operator(), ktory ma blokowac dostep do tego konteksty dla innych watkow, obsluguje zagrywke i tak dalej i tak dalej, czy to ma sens ???

0

Chciałbym się dowiedziec czy mozliwe jest zablokowanie przetwarzania tylko dla konkretnego kontekstu gry w tej mapie ?

0

W Twoim obecnym rozwiązaniu każdy element mapy ma osobny mutex, więc zablokowanie jednego nie wpływa na inne. Jednak, jeśli obsługujesz krótkie zdarzenia, to lepiej użyć eventloopa niż męczyć się z wątkami.

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