2010-01-31 10 views
20

Piszę program, w którym znajduje się obiekt podzielane przez wielu wątków:Czy muszę zablokować obiekt podczas odczytu z niego?

  • A) Wiele wątków Napisz do obiektu (wszystko działa ten sam funkcja)
  • b) wątku odczytu, który ma dostęp przedmiot co 5 sekund
  • C) czytać wątek, który uzyskuje dostęp do obiektu znajduje się żądanie użytkownika

to jest oczywiście konieczne, aby zablokować obiekt pisząc do niego, a nie chcemy wiele wątków do w obrzędu do obiektu w tym samym czasie.

Moje pytania są następujące:

  1. Jest to również konieczne, aby zablokować obiekt podczas czytania od niego?
  2. Czy mogę pomyśleć, że jeśli po prostu zablokujemy obiekt podczas pisania, wystarczająca jest sekcja krytyczna; ale jeśli zablokujemy obiekt podczas czytania lub pisania, konieczne jest muteks?

Zadaję to pytanie, ponieważ w pakiecie Microsoft Office dwa wystąpienia programu Word nie umożliwiają dostępu do dokumentu w trybie dostępu do odczytu/zapisu; ale gdy dokument jest otwierany w trybie odczytu/zapisu, możliwe jest otwarcie kolejnej instancji programu Word w celu uzyskania dostępu do dokumentu w trybie tylko do odczytu. Czy ta sama logika miałaby zastosowanie w wątkach?

+2

Przydatne jest zbadanie, w jaki sposób relacyjne bazy danych to robią, są mistrzami wspólnego dostępu do danych. – skaffman

Odpowiedz

11

Jak już napisał Ofir - jeśli spróbujesz odczytać dane z obiektu, który modyfikuje inny wątek - możesz uzyskać dane w niespójnym stanie.

Ale - jeśli jesteś pewien, że obiekt nie jest modyfikowany, możesz go oczywiście odczytać z wielu wątków. Ogólnie rzecz biorąc, pytanie, które zadajesz, jest mniej więcej problemem czytelników - patrz http://en.wikipedia.org/wiki/Readers-writers_problem

Na koniec - sekcja krytyczna jest terminem abstrakcyjnym i może zostać zaimplementowana za pomocą muteksu lub monitora. Składnia cukru dla sekcji krytycznej w java lub C# (synchronizacja, blokada) używa monitora pod osłonami.

4

Jest to konieczne, ponieważ w przeciwnym razie (chyba że operacje są atomowe) możesz czytać stan pośredni.

Można zezwolić na jednoczesne korzystanie z wielu czytników, które wymagają (nieco) bardziej złożonego rodzaju blokady.

+0

Operacja zapisu jest atomowa, ale bardzo dziękuję za odpowiedź. – Andy

3

Czy konieczne jest również zablokowanie obiektu podczas odczytu z niego?

Jeśli coś jeszcze może do niej napisać w tym samym czasie - tak. Gdyby tylko inny odczyt mógł wystąpić - nie. W waszych okolicznościach powiedziałbym - tak.

Am I słusznie uważają, że jeśli po prostu zablokować obiekt podczas pisania, część krytyczna wystarczy; ale czy możemy zablokować obiekt podczas odczytu lub zapisywać go w postaci , czy potrzebny jest muteks?

Nie, możesz użyć sekcji krytycznej dla obu, przy czym inne rzeczy są równe. Mutexy dodały funkcje na sekcje (nazwane muteksy mogą być używane z wielu procesów, na przykład), ale nie sądzę, że potrzebujesz takich funkcji tutaj.

+0

Dziękuję. Teraz zdaję sobie sprawę, że krytyczne sekcje mogą być używane dla różnych podprogramów, o ile podprogramy należą do tego samego procesu. – Andy

1
  1. zależy od tego, jak go używasz i czytasz. jeśli twój odczyt jest atomowy (tzn. nie zostanie przerwany przez zapis), a przeczytany wątek nie jest zależny od wątków zapisu, to możesz być w stanie pominąć blokadę odczytu. Ale jeśli operacja "odczytu" zajmuje trochę czasu i wymaga interakcji z dużymi obiektami, należy ją zablokować do odczytu.

  2. jeśli odczyt nie zajmie dużo czasu (tzn. Nie opóźni zbyt długo wątków zapisu), sekcja krytyczna powinna wystarczyć.

0

blokowanie jest potrzebne tylko wtedy, gdy dwa procesy mogą zmienić te same elementy tabeli bazy danych. Jeśli chcesz odczytać dane, zawsze jest to bezpieczne. czytasz dane spójnej bazy danych. proces zmiany danych ma wersję shadow, która jest spójna i zastąpi bieżące dane podczas zapisywania. ale jeśli używasz procesu czytania, który zależy od krytycznej wartości z elementów bazy danych, powinieneś poszukać blokad, które wskazują, że te wartości prawdopodobnie zostaną zmienione. więc twoje czytanie jest opóźnione, dopóki nie zniknie zamek.

Powiązane problemy