Używanie typów unikalności w celu wdrożenia bezpiecznego równoległości

19

Od pewnego czasu interesują mnie typy unikalności jako alternatywa dla monad w czysto funkcjonalnych językach; niestety jest to rodzaj ezoterycznej dziedziny badań nad CS, a zasobów online dotyczących programowania z typami unikatowości jest niewiele.

Oczywiste jest, w jaki sposób można zastosować typy unikatowości do implementacji struktur danych stanowych, takich jak referencje („pola”) i tablice, chociaż nie wiadomo, jak można za ich pomocą wdrożyć inne wspólne struktury danych stanowych.

Czy można wdrożyć na przykład blokowanie przy użyciu unikalnych typów? Czy można używać typów unikatowości do udostępniania zmiennych danych w wątkach? Czy można używać unikalnych typów do budowania operacji podstawowych synchronizacji (takich jak muteksy), czy też przekazywanie komunikatów jest konieczne?

Ricky Stewart
źródło
Czy możesz uściślić swoje pytanie? Co, na przykład, wiesz już o blokowaniu przy użyciu unikalnych typów i gdzie Twoja wiedza jest niewystarczająca?
Robert Harvey
> Co, na przykład, już wiesz o blokowaniu za pomocą unikalnych typów Nie wiem nic o blokowaniu za pomocą unikalnych typów - tak naprawdę nie wiem, jak działa bezpieczna równoległość z unikalnymi typami i chciałbym wiedzieć, czy istnieje są wszelkie zasoby na ten temat.
Ricky Stewart
2
@RickyStewart: Prawdopodobnie znasz już Clean ( wiki.clean.cs.ru.nl/Clean ). Chciałem tylko dodać link, ponieważ o nim nie wspomniałeś.
Giorgio
Myślę, że powinieneś przyjrzeć się liniowym typom równoległości. Typy unikatowości IIRC są zbudowane na typach liniowych. Frank Pfenning ma kilka interesujących rzeczy na ten temat
Daniel Gratzer

Odpowiedzi:

2

Czy można wdrożyć na przykład blokowanie przy użyciu unikalnych typów?

Podążyłem za linkiem podanym przez Roberta Harveya i szybko go przeczytałem. Nie mogę powiedzieć, że wszystko zrozumiałem, ani że mam wysoki poziom pewności, że naprawdę zrozumiałem to, co myślę, że zrozumiałem, ale wydaje mi się, że całą istotą zewnętrznej wyjątkowości i niezmienności odniesienia nie jest potrzeba blokowania.

Nowoczesne podejście do wielowątkowości stara się unikać blokowania, ponieważ tylko bardzo doświadczeni programiści mogą pisać kod wykorzystujący blokowanie, a nawet ich kod jest podatny na błędy. Jeśli dodasz do tego fakt, że kod blokujący jest praktycznie nie do przetestowania, powinno być oczywiste, że jest to wysoce niepożądany sposób robienia rzeczy, a każde rozwiązanie mające na celu uwolnienie nas od blokowania jest co najmniej obiecujące.

Unikaliśmy blokowania poprzez przekazywanie wiadomości, co wymaga, aby wiadomości były niezmienne. Z grubsza (na pierwszy rzut oka) niezmienność referencyjna wydaje się być techniką, która może nam pomóc zagwarantować niezmienność bez konieczności konstruowania niezmiennych typów, a wyjątkowość zewnętrzna wydaje się być techniką, która może pomóc nam złagodzić lokalnie rygorystyczny wymóg niezmienności.

Czy można używać typów unikatowości do udostępniania zmiennych danych w wątkach?

W artykule nie podano tego jasno, ale z tego, co rozumiem, zewnętrzna unikatowa grupa obiektów jest bezpieczna dla wątków, ponieważ w jakiś sposób (naprawdę, jak? ) Jest zagwarantowane, że istnieje tylko jedno odniesienie zewnętrzne do tej grupy obiektów, co oznacza, że wątek otrzymujący takie odwołanie może traktować obiekty, do których istnieją odniesienia, jako zmienne bez obawy, że jakiś inny wątek również może je mutować, ponieważ żaden inny wątek nie może mieć innego odniesienia. Byłbym ciekawy, jak taki teoretyczny konstrukt można wdrożyć i egzekwować.

Czy można używać unikalnych typów do budowania operacji podstawowych synchronizacji (takich jak muteksy), czy też przekazywanie komunikatów jest konieczne?

Ponownie, z tego, co rozumiem, zewnętrznie unikalne typy i niezmienność odniesienia mają na celu uczynienie blokad, muteksów i tym podobnych niepotrzebnymi. Przekazywanie wiadomości wydaje się być dobrą drogą i to dobrze.

Mike Nakis
źródło