Menggunakan tipe keunikan untuk menerapkan paralelisme aman

19

Saya telah tertarik pada jenis keunikan sebagai alternatif untuk monad dalam bahasa fungsional murni untuk beberapa waktu; Sayangnya, ini adalah semacam area esoterik penelitian CS dan sumber daya online tentang pemrograman dengan tipe keunikan sedikit dan jarang.

Sudah jelas bagaimana tipe keunikan dapat digunakan untuk menerapkan struktur data stateful seperti referensi ("kotak") dan array, meskipun itu lolos dari saya bagaimana Anda dapat menerapkan struktur data stateful umum lainnya dengan mereka.

Apakah mungkin untuk menerapkan, misalnya, penguncian dengan tipe unik? Dapatkah tipe keunikan digunakan untuk berbagi data yang dapat diubah di seluruh utas? Apakah mungkin untuk menggunakan tipe unik untuk membangun primitif sinkronisasi (seperti mutex), atau apakah pesan perlu?

Ricky Stewart
sumber
Bisakah Anda membuat pertanyaan Anda sedikit lebih spesifik? Apa, misalnya, yang sudah Anda ketahui tentang penguncian dengan tipe unik dan di mana pengetahuan Anda sendiri tidak cukup?
Robert Harvey
> Apa, misalnya, apakah Anda sudah tahu tentang mengunci dengan tipe unik Saya tidak tahu apa-apa tentang mengunci dengan tipe unik - Saya tidak benar-benar tahu bagaimana paralelisme aman bekerja dengan tipe unik dan saya ingin tahu apakah ada adalah sumber daya apa pun tentang topik tersebut.
Ricky Stewart
2
@RickyStewart: Anda mungkin sudah tahu Bersihkan ( wiki.clean.cs.ru.nl/Clean ). Saya hanya ingin menambahkan tautan karena Anda tidak menyebutkannya.
Giorgio
Saya pikir Anda harus melihat tipe linear untuk paralelisme. Tipe keunikan IIRC dibangun pada tipe linier. Frank Pfenning memiliki beberapa hal menarik tentang masalah ini
Daniel Gratzer

Jawaban:

2

Apakah mungkin untuk menerapkan, misalnya, penguncian dengan tipe unik?

Saya mengikuti tautan yang diberikan Robert Harvey dan saya membaca cepat. Saya tidak bisa mengatakan bahwa saya memahami segalanya atau bahwa saya memiliki tingkat kepercayaan yang tinggi bahwa saya benar - benar memahami apa yang saya pikir saya mengerti, tetapi tampaknya bagi saya bahwa seluruh poin keunikan eksternal dan ketidakberubahan referensi adalah tidak perlu mengunci.

Pendekatan modern untuk multithreading mencoba menghindari penguncian karena hanya programmer yang sangat berpengalaman yang dapat menulis kode yang menggunakan penguncian, dan bahkan kode mereka sangat rentan terhadap bug. Jika Anda menambahkan bahwa fakta bahwa kode penguncian sebenarnya tidak dapat dipecahkan, harus jelas bahwa itu adalah cara yang sangat tidak diinginkan dalam melakukan sesuatu, dan solusi apa pun yang bertujuan untuk membebaskan kita dari penguncian menjanjikan untuk sedikitnya.

Cara kami menghindari penguncian adalah dengan pengiriman pesan, yang mengharuskan pesan harus tidak berubah. Secara kasar, (sekilas,), referensi keabadian tampaknya merupakan teknik yang dapat membantu kami menjamin keabadian tanpa harus benar-benar membangun jenis yang tidak dapat diubah, dan keunikan eksternal tampaknya merupakan teknik yang dapat membantu kami merelaksasi persyaratan kekekalan yang ketat secara lokal.

Bisakah tipe keunikan digunakan untuk berbagi data yang dapat diubah di seluruh utas?

Makalah itu tidak secara jelas menyatakannya, tetapi dari apa yang saya pahami, sekelompok objek yang unik secara eksternal aman karena entah bagaimana (sungguh, bagaimana? ) Dijamin bahwa hanya ada satu referensi luar ke dalam kumpulan objek tersebut, yang berarti bahwa sebuah utas yang menerima referensi semacam itu dapat memperlakukan objek yang dirujuk sebagai bisa berubah-ubah tanpa harus khawatir bahwa beberapa utas lain juga dapat memutasinya, karena tidak ada utas lain yang mungkin memiliki referensi lain. Saya ingin tahu bagaimana konstruksi teoretis seperti itu dapat diimplementasikan dan ditegakkan.

Apakah mungkin untuk menggunakan tipe unik untuk membangun primitif sinkronisasi (seperti mutex), atau apakah pesan perlu?

Sekali lagi, dari apa yang saya pahami, tipe unik eksternal dan referensi keabadian dimaksudkan untuk membuat kunci, mutex, dan sejenisnya tidak perlu. Pesan lewat tampaknya menjadi cara untuk pergi, dan itu bagus.

Mike Nakis
sumber