A Microsoft lançou uma nova versão do .NET 4.0 Beta 1, que incorpora o STM.NET, o Software Transactional Memory. O STM é um mecanismo alternativo à sincronização baseada em locks utilizada para controlar o acesso concorrente à memória compartilhada.
A Microsoft define o STM.NET como:
O Software Transactional Memory (STM.NET) é um mecanismo para isolação eficiente de estados compartilhados. O programador demarca a região de código operando dentro de uma transação que é atômica (“atomic”) ou isolada (“isolated”) de outros trechos de código transacional rodando concorrentemente.
Memória transacional é considerada uma tecnologia promissora pela comunidade acadêmica e é repetidamente mencionada como uma tecnologia bem-vinda para a próxima onda de aplicações que escalam com hardware multi-core modernos. O objetivo é ter a possibilidade de se aproveitar da concorrência ao se utilizar componentes escritos exclusivamente por experts e consumidos por programadores de aplicações que podem, por sua vez, fazer uma composição deles utilizando STM. Memória transacional oferece um mecanismo fácil de usar para se fazer isso de forma segura.
O STM utiliza uma abordagem otimista para acessar um pedaço de memória compartilhada. Ao invés de bloquear o componente que escreve até que seja seguro fazer mudanças nos dados compartilhados, a thread acessa e edita os dados compartilhados enquanto registra cada operação de escrita e leitura que executa. No final, ela verifica se outra thread acessou os dados compartilhados ao mesmo tempo. Se não, um commit é executado e as mudanças são marcadas como permanentes. Se outra thread acessou os dados, a transação é abortada, e todas as mudanças são retrocedidas.
O STM.NET utiliza o método Atomic.Do() para marcar as linhas de código que são executadas em uma transação:
Atomic.Do(()=> {
<statememts>
});
Assim como qualquer outro mecanismo de lock, o STM introduz um impacto na performance porque tem que manter o registro de escrita e leitura e por causa do tempo gasto durante a etapa de commit. Alguns consideram que este impacto é compensado pelos benefícios conceituais que tornam o STM mais fácil de usar do que aplicação minuciosa de locks. Em um estudo chamado A programação transacional é realmente mais fácil?, os autores Christopher J. Rossbach, Owen S. Hofmann e Emmett Witchel da Universidade do Texas em Austin analisam o processo de aprendizagem e desenvolvimento utilizando STM comparado a outros tipos de mecanismos de lock, notando que:
Na média, memória transacional requer mais tempo de desenvolvimento do que locks gerais, mas menos tempo do que locks mais precisos e sincronização condicional.
… Nós concluímos que locks gerais e transações exigem menos tempo do que locks precisos nas atribuições mais complexas de duas vias. Isso ecoa a promessa das transações, removendo a complexidade da codificação e do debug de locks precisos e ordenação de locks quando mais de um é necessário.
O estudo conclui:
Este paper oferecer evidência de que programação transacional é realmente menos sujeita a erros do que locks de alta performance, mesmo que um programador novato tenha problemas para entender transações. Estudantes sujeitos a avaliação mostraram que utilizar memória transacional é um pouco mais difícil do que utilizar locks gerais e mais fácil do que utilizar locks precisos e sincronização de condições. Entretanto, análises da taxa de erros de sincronização em códigos de estudantes apresentaram um resultado mais dramático, mostrando que, para tarefas de programação similares, transações são consideradas mais fáceis de serem corrigidas do que locks.
Exigências: Visual Studio 2008, Windows Installer 3.1 ou superior, Internet Explorer 5.01 ou superior. STM.NET está disponível atualmente apenas para o C#.
Fontes: NET 4.0 Beta 1 with STM.NET, STM Programming Guide, STM: Samples, Documentation, and Configuration files.