2010-02-25 11 views
6

To jest pytanie do wywiadu. Jak zaimplementować muteks do odczytu/zapisu? Będzie wiele wątków czytania i zapisywania do zasobu. Nie jestem pewien, jak to osiągnąć. Jeśli potrzebujesz informacji, daj mi znać.Read write mutex w C++

Aktualizacja: Nie jestem pewien, czy moje powyższe stwierdzenie jest prawidłowe/zrozumiałe. Ale tak naprawdę chcę wiedzieć, w jaki sposób można zaimplementować wielokrotne zapisywanie i wielokrotne zapisywanie na pojedynczym obiekcie w kategoriach mutex i innych potrzebnych obiektów synchronizacji?

+0

Czy mówisz o normalnym muteksie lub Muteksie wielokrotnego odczytu/zapisu pojedynczego zaimplementowanym z muteksami/semaforami/zmiennymi warunkowymi? – stefaanv

+0

@stefaanv: Nie jestem pewien, ale myślę, że jest to dla wielu muteksów zapisu/wielokrotnego zapisu zaimplementowanych ze zmiennymi mutexes/semaphres/condition. Czy jest coś takiego? – jasonline

+0

Wielokrotne muteksy odczytu/zapisu pojedynczego nie są proste, po prostu miałem do nich dostęp i nie udało mi się :-(więc tutaj jest link wikipedia: http://en.wikipedia.org/wiki/Readers-writer_lock – stefaanv

Odpowiedz

12

Sprawdź Dekker's algorithm.

algorytm dekkera to pierwszy znany poprawne rozwiązanie problemu wzajemnego wykluczania programowania współbieżnego . Rozwiązaniem jest przypisana holenderskiemu matematykowi Th. J. Dekker przez Edsger W. Dijkstra w jego rękopisie na temat współpracy sekwencyjnej procesów. Umożliwia dwóm wątkom na udostępnianie zasobów jednorazowych bez konfliktu , używając tylko pamięci współużytkowanej do komunikacji .

Należy zauważyć, że algorytm Dekkera stosuje technikę spinlock (a nie busy waiting).
(Th. Rozwiązanie J. Dekker, w wymienionych przez E. W. Dijkstra w Jego EWD1303 paper) alt text

+1

Podoba mi się, że właśnie odpowiedziałeś na pytanie, zamiast dostać się do OS nitty gritty :) –

1

Krótka odpowiedź jest taka, że ​​jest to trudny zaskakująco toczyć własne blokady odczytu/zapisu. Bardzo łatwo jest przeoczyć bardzo subtelny problem z synchronizacją, który może spowodować zakleszczenie, dwa wątki, oba myśląc, że mają "wyłączną" blokadę, itp.

W skrócie, musisz zachować liczbę aktywnych czytników w dowolnym czasie. Tylko wtedy, gdy liczba aktywnych czytników wynosi zero, należy przyznać dostęp do zapisu wątku. Istnieje kilka opcji wyboru, czy czytelnicy lub scenarzyści mają pierwszeństwo. (Często chcesz dać pisarzom priorytet, przy założeniu, że pisanie odbywa się rzadziej). (Zaskakująco) trudną częścią jest upewnienie się, że żaden autor nie ma dostępu, gdy są czytelnicy, lub odwrotnie.

Istnieje doskonały artykuł MSDN, "Compound Win32 Synchronization Objects", który prowadzi użytkownika przez proces tworzenia blokady czytnika/pisarza. Zaczyna się proste, a następnie staje się bardziej skomplikowane, aby obsłużyć wszystkie narożne przypadki. Jedną z rzeczy, która wyróżniała się, było to, że pokazali próbkę, która wyglądała doskonale. Potem wyjaśnili, dlaczego tak naprawdę nie zadziała. Gdyby nie wskazali problemów, być może nigdy nie zauważylibyście. Warto przeczytać.

Mam nadzieję, że to będzie pomocne.

0

To brzmi jak trudne pytanie do wywiadu; Nie "implementowałbym" muteksu do odczytu/zapisu, w sensie pisania od zera - istnieje wiele lepszych dostępnych z półki rozwiązań. Rozsądną rzeczywistą rzeczą byłoby użycie istniejącego typu muteks. Być może to, co naprawdę chcieli wiedzieć, to w jaki sposób można by użyć takiego typu?

+0

ShellShock: Czy muteks odczytu i zapisu nie może być zaimplementowany w kategoriach zwykłego muteksa i semafora? Nie znam semaforów, ale mam przeczucie, że prowadzący prowadzi mnie do tego rozwiązania. – jasonline

+1

Dowolny przykład gotowych rozwiązań, które możesz polecić? – jasonline

0

Afaik potrzebujesz albo atomowej instrukcji porównania i zamiany, albo musisz mieć możliwość wyłączenia przerwań. Zobacz Compare-and-swap na stronie wikipedia. Przynajmniej tak zaimplementuje system operacyjny. Jeśli masz system operacyjny, stań na jego barkach i użyj istniejącej biblioteki (na przykład: boost).

Powiązane problemy