¿Cómo puedo tener muchos hilos que necesitan saber la próxima ID para procesar y luego incrementar ese número de manera segura?

StackOverflow https://stackoverflow.com/questions/1402984

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un programa que tendrá un montón de hilos procesando datos.

Cada subproceso debe capturar la siguiente ID disponible, incrementar esa ID en 1 para la siguiente hebra y hacerlo de una manera segura para subprocesos.

¿Es esta una instancia en la que usaría un mutex? ¿Debo usar una cola sincronizada en su lugar y llenarla con todas las 300,000 ID o es esto innecesario?

Debería tener un solo número entero y, de alguna manera, bloquear la recuperación y actualización de ese número para que aparezca el subproceso1, obtiene " 20 " como la siguiente ID y luego la incrementa a " 21 " mientras otro hilo está esperando?

¿Cuál es la mejor práctica para este caso de uso?

¿Fue útil?

Solución

Puede hacer esto sin bloquear a través de Interlocked.Increment .

Solo haz esto así:

private static int value;
public static int Value
{
    get { return Interlocked.Increment(ref value); }
}

Esto siempre devolverá un entero incremental, sin bloqueos y con seguridad perfecta para subprocesos.

Otros consejos

Este es probablemente el candidato perfecto para Interlocked.Increment .

int id = 0;

int nextId = Interlocked.Increment(ref id); // returns the incremented value

El Incremento se realiza como una operación atómica y es seguro para subprocesos.

No.

La mejor manera de hacerlo es Interlocked.Increment ().

Básicamente, puede realizar el incremento de manera segura sin subprocesos sin bloquear según las garantías proporcionadas por la arquitectura de la CPU.

Debería buscar en la Clase enclavada . Proporciona funcionalidad para incrementar atómicamente el valor de un número entero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top