2010-04-22 19 views
7

Zgodnie z an article na stronie IBM.com "warunkiem wyścigu jest sytuacja, w której dwa lub więcej wątków lub procesów odczytuje lub zapisuje niektóre udostępnione dane, a ostateczny wynik zależy od czasu zaplanowania wątków. może prowadzić do nieprzewidywalnych wyników i subtelnych błędów programu. " . Chociaż artykuł dotyczy języka Java, ogólnie uczono mnie tej samej definicji.Co ze stanem wyścigu w czytaniu wielowątkowym?

O ile mi wiadomo, prosta operacja odczytu z pamięci RAM polega na ustawieniu stanów określonych linii wejściowych (adres, odczyt itp.) I odczytaniu stanów linii wyjściowych. Jest to operacja, która oczywiście nie może być wykonywana jednocześnie przez dwa urządzenia i musi być serializowana.

Załóżmy teraz, że mamy sytuację, w której kilka wątków uzyskuje dostęp do obiektu w pamięci. Teoretycznie dostęp ten powinien zostać zserializowany, aby zapobiec wyścigowi. Ale np. Algorytmy czytników/pisarzy przyjmują, że dowolna liczba czytników może korzystać z pamięci współdzielonej w tym samym czasie.

Pytanie brzmi: czy w przypadku korzystania z wielowątkowości należy wprowadzić wyłączny blokada do odczytu (np. W WinAPI)? Jeśli nie, dlaczego? Gdzie zaimplementowano tę kontrolę - OS, sprzęt?

poważaniem, Kuba

+0

hah, told'ya;] –

Odpowiedz

6

Odczytywanie pamięci na poziomie sprzętowym odbywa się sekwencyjnie - nie trzeba się martwić o współbieżności na tym poziomie. Dwa wątki zawierają instrukcje odczytu i wszystkie potrzebne rzeczy - ustawianie adresów na magistrali adresowej i rzeczywiste odczyty są realizowane przez sprzęt z dostępem do pamięci w taki sposób, że odczyty zawsze będą działać poprawnie.

Tak samo jest w przypadku scenariuszy odczytu/zapisu, z wyjątkiem sytuacji, gdy żądania odczytu i zapisu są przeplatane, a wyniki będą różne w zależności od czasu i dlatego konieczna jest synchronizacja.

0

Nie ma prostej odpowiedzi na to pytanie. Różne interfejsy API (i różne środowiska) będą miały różne poziomy bezpieczeństwa wielowątkowego i wielowątkowego.

2

Tak długo, jak nic nie zmienia danych, to zupełnie bezpiecznie jest czytać je z kilku wątków. Nawet jeśli dwa procesory (lub rdzenie) będą ścigały się, aby uzyskać dostęp do pamięci w celu odczytu w tym samym cyklu taktowania, ich dostęp będzie szeregowany przez kontroler pamięci i nie będą się wzajemnie zakłócać. Ta funkcja jest niezbędna do prawidłowego działania HW.

Powiązane problemy