Використання типів унікальності для здійснення безпечного паралелізму


19

Мене вже деякий час цікавлять унікальні типи як альтернатива монадам у чистих функціональних мовах; на жаль, це своєрідна езотерична область досліджень CS та Інтернет-ресурсів щодо програмування з унікальними типами мало і далеко між ними.

Очевидно, наскільки унікальні типи можуть бути використані для реалізації таких даних, як посилання ("коробки") та масиви, хоча це не дозволяє мені реалізувати з ними інші загальні структури даних.

Чи можливо реалізувати, наприклад, блокування з унікальними типами? Чи можна використовувати унікальні типи для обміну змінними даними між потоками? Чи можливо використовувати унікальні типи для побудови примітивів для синхронізації (як мутекси), чи потрібне передавання повідомлення?


Чи можете ви зробити своє питання трохи більш конкретним? Що, наприклад, ви вже знаєте про блокування унікальних типів і де ваші власні знання недостатньо?
Роберт Харві

> Що, наприклад, ви вже знаєте про блокування з унікальними типами, я нічого не знаю про блокування з унікальними типами - я не знаю, наскільки безпечний паралелізм працює з унікальними типами, і я хотів би знати, чи є чи є будь-які ресурси по темі.
Рікі Стюарт


2
@RickyStewart: Напевно, ти вже знаєш Clean ( wiki.clean.cs.ru.nl/Clean ). Я просто хотів додати посилання, тому що ви його не згадали.
Джорджіо

Я думаю, вам слід розібратися в лінійних типах для паралелізму. Типи унікальності IIRC будуються на лінійних типах. У Френка Пфеннінга є кілька цікавих матеріалів на цю тему
Даніель Гратцер

Відповіді:


2

Чи можливо реалізувати, наприклад, блокування з унікальними типами?

Я перейшов за посиланням, яке надав Роберт Харві, і я швидко перечитав. Я не можу сказати, що я все зрозумів, або що у мене високий рівень впевненості, що я дійсно зрозумів те, що, на мою думку, зрозумів, але мені здається, що вся суть зовнішньої унікальності та незмінність еталону полягає в тому, що немає необхідності в блокуванні.

Сучасні підходи до багатопотокової роботи намагаються уникати блокування, оскільки тільки досвідчені програмісти можуть писати код, який використовує блокування, і навіть їх код дуже схильний до помилок. Якщо додати ще й той факт, що код блокування практично не можна визначити, має бути очевидним, що це дуже небажаний спосіб робити справи, і будь-яке рішення, спрямоване на звільнення від блокування, обіцяє найменше.

Те, як ми уникали блокування, - це передача повідомлень, що вимагає, щоб повідомлення були незмінними. Приблизно (на перший погляд) еталонна незмінність представляється технікою, яка може допомогти нам гарантувати незмінність без необхідності конструювати незмінні типи, а зовнішня унікальність виявляється технікою, яка може допомогти нам розслабити сувору вимогу незмінність на місцях.

Чи можна використовувати унікальні типи для обміну змінними даними між потоками?

У документі це чітко не зазначено, але, наскільки я розумію, зовнішній унікальний кластер об'єктів є безпечним для потоків, тому що якось (справді, як? ) Гарантується, що в цьому кластері об’єктів існує лише одна зовнішня посилання, це означає, що потік, що отримує таку посилання, може ставитися до посилаються об'єктів як до змінних, не турбуючись про те, що якийсь інший потік також може мутувати їх, оскільки жоден інший потік не може мати іншого посилання. Мені було б цікаво дізнатись, як можна реалізувати та застосувати такий теоретичний конструкт.

Чи можливо використовувати унікальні типи для побудови примітивів для синхронізації (як мутекси), чи потрібне передавання повідомлення?

Знову ж таки, наскільки я розумію, зовнішні унікальні типи та незмінність посилань мають на меті зробити замки, мютекси тощо тощо непотрібними. Здається, передача повідомлень - це шлях, і це добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.