Usando tipos de exclusividade para implementar paralelismo seguro


19

Estou interessado em tipos de exclusividade como alternativa às mônadas em linguagens funcionais puras há algum tempo; infelizmente, essa é uma área esotérica da pesquisa em CS e os recursos on-line sobre programação com tipos de exclusividade são poucos e distantes entre si.

É óbvio como os tipos de exclusividade podem ser usados ​​para implementar estruturas de dados com estado, como referências ("caixas") e matrizes, embora me escapa como é possível implementar outras estruturas de dados com estado com elas.

É possível implementar, por exemplo, bloqueio com tipos exclusivos? Tipos de exclusividade podem ser usados ​​para compartilhar dados mutáveis ​​entre threads? É possível usar tipos exclusivos para criar primitivas de sincronização (como mutexes) ou é necessária a passagem de mensagens?


Você pode tornar sua pergunta um pouco mais específica? O que, por exemplo, você já sabe sobre o bloqueio com tipos exclusivos e onde seu conhecimento é insuficiente?
Robert Harvey

> O que, por exemplo, você já sabe sobre o bloqueio com tipos únicos? Eu não sei nada sobre o bloqueio com tipos únicos - eu realmente não sei como o paralelismo seguro funciona com tipos únicos e eu gostaria de saber se existe existem recursos sobre o tópico.
Ricky Stewart


2
@ RickyStewart: Você provavelmente já conhece o Clean ( wiki.clean.cs.ru.nl/Clean ). Eu só queria adicionar o link porque você não o mencionou.
Giorgio

Eu acho que você deve procurar tipos lineares para paralelismo. Os tipos de exclusividade do IIRC são criados em tipos lineares. Frank Pfenning tem algumas coisas interessantes sobre o assunto
Daniel Gratzer

Respostas:


2

É possível implementar, por exemplo, bloqueio com tipos exclusivos?

Segui o link fornecido por Robert Harvey e fiz uma rápida leitura. Não posso dizer que entendi tudo ou que tenho um alto nível de confiança de que realmente entendi o que acho que entendi, mas parece-me que todo o ponto da singularidade externa e da imutabilidade de referência é que não há necessidade de bloqueio.

As abordagens modernas do multithreading tentam evitar o bloqueio, porque somente programadores altamente experientes podem escrever código que usa o bloqueio, e mesmo o código deles é altamente propenso a ter bugs. Se você acrescenta ainda que o fato de o código de bloqueio ser praticamente impossível de ser testado, deve ser óbvio que é uma maneira altamente indesejável de fazer as coisas, e qualquer solução com o objetivo de nos libertar do bloqueio é promissora, no mínimo.

A maneira como evitamos o bloqueio é com a passagem de mensagens, o que exige que as mensagens sejam imutáveis. Grosso modo, (à primeira vista), a imutabilidade de referência parece ser uma técnica que pode nos ajudar a garantir a imutabilidade sem ter que realmente construir tipos imutáveis, e a exclusividade externa parece ser uma técnica que pode nos ajudar a relaxar localmente o estrito requisito de imutabilidade.

Tipos de exclusividade podem ser usados ​​para compartilhar dados mutáveis ​​entre threads?

O artigo não afirmou claramente, mas, pelo que entendi, um cluster de objetos externo único é seguro para threads porque, de alguma forma (realmente, como? ), É garantido que exista apenas uma referência externa nesse cluster de objetos, o que significa que um encadeamento que recebe tal referência pode tratar os objetos referenciados como mutáveis ​​sem ter que se preocupar que outro encadeamento também possa modificá-los, porque nenhum outro encadeamento pode ter outra referência. Gostaria de saber como essa construção teórica pode ser implementada e aplicada.

É possível usar tipos exclusivos para criar primitivas de sincronização (como mutexes) ou é necessária a passagem de mensagens?

Novamente, pelo que entendi, tipos externamente exclusivos e imutabilidade de referência têm como objetivo tornar desnecessários bloqueios, mutexes e similares. A passagem de mensagens parece ser o caminho a seguir, e isso é bom.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.