No se puede superar la simplicidad de una cola de mensajes bloqueada. Yo digo que no pierdas tu tiempo con algo más complejo.
Lea en la instrucción de bloqueo.
lock
EDITAR
Aquí se muestra un ejemplo del objeto de Microsoft cola envuelta por lo que todas las acciones en contra son seguros para subprocesos.
public class Queue<T>
{
/// <summary>Used as a lock target to ensure thread safety.</summary>
private readonly Locker _Locker = new Locker();
private readonly System.Collections.Generic.Queue<T> _Queue = new System.Collections.Generic.Queue<T>();
/// <summary></summary>
public void Enqueue(T item)
{
lock (_Locker)
{
_Queue.Enqueue(item);
}
}
/// <summary>Enqueues a collection of items into this queue.</summary>
public virtual void EnqueueRange(IEnumerable<T> items)
{
lock (_Locker)
{
if (items == null)
{
return;
}
foreach (T item in items)
{
_Queue.Enqueue(item);
}
}
}
/// <summary></summary>
public T Dequeue()
{
lock (_Locker)
{
return _Queue.Dequeue();
}
}
/// <summary></summary>
public void Clear()
{
lock (_Locker)
{
_Queue.Clear();
}
}
/// <summary></summary>
public Int32 Count
{
get
{
lock (_Locker)
{
return _Queue.Count;
}
}
}
/// <summary></summary>
public Boolean TryDequeue(out T item)
{
lock (_Locker)
{
if (_Queue.Count > 0)
{
item = _Queue.Dequeue();
return true;
}
else
{
item = default(T);
return false;
}
}
}
}
EDITAR 2
espero que este ejemplo ayuda. Recuerda que esto es básico. Usando estas ideas básicas puede aprovechar de forma segura la potencia de los hilos.
public class WorkState
{
private readonly Object _Lock = new Object();
private Int32 _State;
public Int32 GetState()
{
lock (_Lock)
{
return _State;
}
}
public void UpdateState()
{
lock (_Lock)
{
_State++;
}
}
}
public class Worker
{
private readonly WorkState _State;
private readonly Thread _Thread;
private volatile Boolean _KeepWorking;
public Worker(WorkState state)
{
_State = state;
_Thread = new Thread(DoWork);
_KeepWorking = true;
}
public void DoWork()
{
while (_KeepWorking)
{
_State.UpdateState();
}
}
public void StartWorking()
{
_Thread.Start();
}
public void StopWorking()
{
_KeepWorking = false;
}
}
private void Execute()
{
WorkState state = new WorkState();
Worker worker = new Worker(state);
worker.StartWorking();
while (true)
{
if (state.GetState() > 100)
{
worker.StopWorking();
break;
}
}
}
Puede acceder a cualquier variable en el alcance de un hilo. p.ej. 2 hilos pueden llamar a la misma función y acceder a la instancia miembro/variables estáticas. Compartir es trivial, sincronizar el acceso variable a través de múltiples hilos es la tarea más diff. – Gishu
Estamos tratando de leer la instancia de objeto disponible en un hilo en otro hilo, y tenemos una restricción para mantener variable global/estática, ¿hay alguna buena idea para lograrlo? –
No tiene acceso a los hilos como tal. Más bien, accedes a objetos que los hilos pueden ver. Si el código que se ejecuta en un subproceso puede acceder a una instancia de objeto, o datos estáticos, puede cambiarlo. Si otro hilo puede ver esa instancia o datos estáticos, entonces se ha comunicado entre los dos hilos. – djna