2008-11-29 12 views
5

Soy nuevo en .net y me gustaría saber si .net tiene el equivalente en Java de AtomicInteger, ConcurrentLinkedQueue, etc.Construcciones sin bloqueo en .net

Hice un poco de búsqueda y no pude encontrar nada.

Los algoritmos sin bloqueo necesitan algún tipo de instrucción CAS, que se proporciona a través de la clase insegura no documentada en Java. ¿.net tiene algo equivalente?

Respuesta

2

La clase Interlocked tiene todos los métodos estáticos necesarios para realizar operaciones atómicas simples como incremento, decremento, comparar, intercambio, etc. Salida http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx

Para la mayoría de las colecciones se puede obtener una colección sincronizada a través de un miembro estático llamado "Sincronizado". Sin embargo, tenga en cuenta que estas construcciones no están libres de bloqueos, simplemente ocultan el desorden del uso de bloqueos/semáforos. Compruebe el método sincronizado de la colección de colas http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized.aspx

4

He escrito una buena cantidad de estructuras de cobro inmutables sin enclavamiento en .Net. Esto incluye, árboles binarios, mapas, matrices, listas enlazadas, etc ... La fuente y los binarios están disponibles en la galería de código

RantPack

+0

savia. gracias amigo. –

0

Para información, es probable (here) que .NET 4.0 heredarán CCR/TPL desde Parallel Extensions. TPL, en particular, introduce un rango de de colecciones y otras construcciones diseñadas para escenarios avanzados de subprocesamiento (con bloqueos mínimos, etc.).

Por ahora, hay un número limitado de colecciones roscados, etc., además de los habituales primatives de bloqueo, además de Interlocked, etc.

0

Aquí está el problema que veo con la clase Interlocked de .NET.

Tengo varios hilos actualizando un contador. Cada subproceso debe obtener un valor único del contador, por lo tanto, ningún subproceso debe tener el mismo valor.

La forma en la clase enclavada en las obras .net, tengo -

int counter; 
void code(){ 
    myThreadVal = Interlocked.increment(counter); 
} 

ahora ya que ambos hilos pueden ver el mismo valor del contador, que ambos pueden obtener el mismo valor de myThreadVal.

Sin embargo, en el caso de AtomicInteger de java que nunca sucedería, cada hilo siempre obtendría un valor diferente.

+0

ahh, ¿entonces te refieres a Thread Local Storage? –

+0

no. no es un subproceso local, ya que este contador se comparte entre varios subprocesos. – pdeva

+3

No, dos subprocesos nunca verán el mismo valor de myThreadValue. Interlocked.Increment es atómico. Sin embargo, debes pasar el contador por ref. –

Cuestiones relacionadas