Estrutura de Dados Coordenadas, EDC, é o novo conjunto de objetos thread-safe, em sua maioria coleções, planejados para o .NET 4. Depois de 6 meses de silêncio, temos novidades significativas. A mais notável é a inclusão de técnicas de programação funcional para reduzir a necessidade de uso de padrões de projeto de software.
A primeira nova classe é a ConcurrentLinkedList. ConcurrentLinkedList utiliza uma função predicada com o método TryInsertBetween para inserir elementos de maneira segura com relação a threads. A função predicada é chamada pelo próprio objeto para determinar a localização exata da inserção, deixando esta classe mais fácil de usar que a LinkedList normal, mesmo em senários de thread simples.
Outro lugar onde técnicas de programação funcional estão sendo usadas é no objeto SpinWait. Ao invés de manualmente escrever laços e chamar SpinOnce repetidas vezes, desenvolvedores podem passar um predicado para o método SpinWait.SpinUntil.
Próximo na fila é o novo tipo ConcurrentBag. Este tipo é uma coleção de filas que possuem cargas balanceadas em diferentes threads. Normalmente cada thread lê e escreve em sua prórpria fila, mas se esta está vazia, a thread "rouba" itens da fila de outra thread. Isto significa que na maioria do tempo não haverá espera nas threads, mas cada thread pode executar em força total enquanto houver trabalho para ser feito. ConcurrentBag não substitue a ConcurrentQueue, que ainda é a maneira mais indicada para cenários "produtor-consumidor".
A classe WriteOnce foi removida. Esta não foi uma funcionalidade interessante, um pouco mais de um objeto que retorna uma exceção se o método Set da propriedade é chamada mais de uma vez. As classes bem mais úteis Lazy e LazyVariable foram mantidas. Ambas estão de acordo com a idéia de inicialização deferida, também conhecidas como "futuras". A primeira é uma classe e a segunda uma mais leve e um pouco menos segura estrutura. Também adicionadas estão a LazyInitializer, quando o uso da memória é algo se considerar, e a ThreadLocal, uma maneira segura de combinar armazenamento local de uma thread com inicialização deferida.
A habilidade de cancelar tarefas, sem abortar threads, continua um problema importante. Para ajudar nisso, foram adicionadas versões de métodos que podem ser bloqueados com habilidade de cancelamento. A Microsoft tem trabalhado para que o modelo de cancelamento esteja em todos os lugares, o que simplificaria grandemente o desenvolvimento de bibliotecas.
Para mais informações, leia o Blog da Microsoft sobre Computação Paralela ou nosso artigo anterior sobre EDC.