2009-04-15 17 views
6

Microsoft ha almeno due approcci diversi per il supporto migliorato per le operazioni simultanee.Libreria CCR di Microsoft vs Task parallela

1) è la concorrenza Coordinamento Runtime (CCR), che fa parte di Microsoft Robotics Studio e CCR & DSS Toolkit

2) Task Parallel Library (TPL) (parte di .NET 4.0 e ora in Beta 1 stampa)

Mi piacerebbe sapere se qualcuno ha esperienza con questi due diversi software e li confronta e li confronta?

+0

Leggi Erlang concorrenza, CCR è copia concorrenza Erlang, tipico modo in cui Microsoft. Task parellel è multi threading – mamu

risposta

9

In linea di massima, entrambi i quadri hanno obiettivi complementari ma diversi.

Il CCR offre primitive per il coordinamento di processi concorrenti. Il coordinamento è la colla che fa funzionare un gruppo di processi nel suo complesso - così il CCR offre primitive per lo scambio di messaggi attraverso i cosiddetti canali. I processi possono attendere l'arrivo di un messaggio su un canale, un numero di canali o uno qualsiasi di un numero di canali e così via. Questo è un paradigma particolare per il coordinamento di processi concorrenti che funziona bene. Nota anche che non è gratuito - devi acquistare separatamente da Microsoft.

Il TPL offre primitive e infrastruttura a parallelamente i calcoli o gli algoritmi in modo semi-automatico. Uno dei primitivi più ovvi è il parallelo per il ciclo: sembra un po 'come un ciclo for, ma tenta di eseguire il ciclo in parallelo.

Quindi, se si dispone di un gruppo di processi che si desidera coordinare a un livello superiore rispetto all'utilizzo di stati e blocchi condivisi, utilizzare il CCR. Se si dispone di un processo intensivo di calcolo che si desidera eseguire in modo efficiente su un computer multi-core, utilizzare il TPL.

+4

schelfthout: da qualche giorno è stato rilasciato gratuitamente (finalmente) – Toad

5

Non è né uno né uno scenario. Il CCR è una libreria che supporta determinati schemi di programmazione. È possibile mischiare CCR e il codice TPL come questo, ecco una Parallel.For all'interno di un delegato di ricezione:

using System; 
using System.Threading; 
using System.Threading.Tasks; 
using Microsoft.Ccr.Core; 

namespace Demo 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Dispatcher dispatcher = new Dispatcher(); 
      DispatcherQueue taskQueue = new DispatcherQueue("Demo", dispatcher); 
      Port<int> portInt = new Port<int>(); 
      portInt.Post(Int32.Parse(args[0])); 

      Arbiter.Activate(
       taskQueue, 
       portInt.Receive(delegate(int count) 
       { 
        Parallel.For(0, count, i => 
        { 
         Console.Write(i.ToString() + " "); 
        }); 
       } 
      )); 
     } 
    } 
} 
Problemi correlati