2012-02-13 16 views
5

Obecnie mam 2 procesy, które komunikują się za pomocą funkcji boost message_queue i shared_memory. Wszystko działa jak należy.Czy jest to system zabezpieczania wątków typu :: :: internal?

Teraz muszę wykonać jeden z tych procesów z wieloma wątkami (dzięki ponownemu zwiększeniu) i zastanawiałem się, czy muszę zastosować mechanizm ochrony między wątkami (np. Mutex), czy też bibliotekę boost :: interprocess już zapewnia mechanizm ochrony?

Nie znalazłem żadnych informacji na ten temat w dokumentacji doładowania. Przy okazji używam doładowania 1.40.

Z góry dziękuję.

+0

Czy przeczytałeś http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html? –

Odpowiedz

2

zasobów udostępnionych od boost :: Interprocess (współdzielonej pamięci, etc) wymagają, aby zapewnić niezbędną synchronizację. Dzieje się tak dlatego, że możesz nie wymagać synchronizacji, a zazwyczaj jest to dość droga operacja.

Załóżmy na przykład, że masz proces, który zapisał do pamięci współdzielonej bieżące statystyki czegoś w 32-bitowym formacie liczby całkowitej i kilka procesów odczytujących te wartości. Ponieważ wartości są liczbami całkowitymi (a zatem na twojej platformie odczyty i zapisy są atomowe) i masz tylko jeden proces, który je zapisuje, a kilka procesów czyta je, nie jest wymagana synchronizacja dla tego projektu.

Jednak w niektórych przypadkach będziesz potrzebował synchronizacji, tak jak w powyższym przykładzie miał wiele pisarzy, lub zamiast liczb całkowitych używasz danych ciągów. Istnieją różne mechanizmy synchronizacji wewnątrz boost (jak również te, non-Boost, ale od czasu już przy użyciu Boost), opisane tutaj:

[Zwiększ informacje dla wersji stabilnej: 1,48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[Boost informacji dla wersji używasz: 1,40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

ze wspólną pamięcią jest to powszechna praktyka, aby umieścić mechanizm synchronizacji u podstawy segmentu pamięci współdzielonej, gdzie może być anonimowe (czyli jądro OS nie zapewnia dostępu do to po imieniu). W ten sposób wszystkie procesy wiedzą, jak zablokować segment pamięci wspólnej i można skojarzyć blokady z ich segmentami (jeśli miałeś na przykład wiele)

Pamiętaj, że muteks wymaga tego samego wątku wykonania (wewnątrz procesu) do odblokuj to, co je zablokowało. Jeśli chcesz zablokować i odblokować obiekt synchronizacji z różnych wątków wykonania, potrzebujesz semafora.

Należy się upewnić, że jeśli zdecydujesz się użyć muteksu, który jest muteksem międzyprocesowym (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html) w przeciwieństwie do muteksu w bibliotece wątków boost, która jest przeznaczona dla pojedynczego procesu z wieloma wątkami.

+0

+1 dla "Ponieważ wartości są liczbami całkowitymi (a zatem na twojej platformie odczyty i zapisy są atomowe) i masz jeden proces zapisywania ich i kilka procesów czytania ich, nie jest wymagana synchronizacja dla tego projektu." – FaceBro