Bạn không thể đánh bại sự đơn giản của hàng đợi tin nhắn bị khóa. Tôi nói đừng lãng phí thời gian của bạn với bất cứ điều gì phức tạp hơn.
Đọc trên báo cáo khóa.
lock
EDIT
Dưới đây là một ví dụ của đối tượng Microsoft Queue bọc vì vậy tất cả các hành động chống lại nó là chủ đề an toàn.
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;
}
}
}
}
EDIT 2
Tôi hy vọng ví dụ này giúp. Hãy nhớ rằng đây là xương trần. Sử dụng những ý tưởng cơ bản này, bạn có thể khai thác sức mạnh của chủ đề một cách an toàn.
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;
}
}
}
Bạn có thể truy cập bất kỳ biến nào trong phạm vi từ chuỗi. ví dụ. 2 luồng có thể gọi cùng một hàm và truy cập cá thể thành viên/biến tĩnh. Chia sẻ là tầm thường, đồng bộ hóa truy cập biến trên nhiều luồng là nhiệm vụ khác biệt hơn. – Gishu
Chúng tôi đang cố gắng đọc đối tượng có sẵn trong một chủ đề thành một chuỗi khác và chúng tôi có một hạn chế để duy trì biến toàn cầu/tĩnh, có một số ý tưởng hay để đạt được nó không? –
Bạn không truy cập chủ đề như vậy. Thay vào đó bạn truy cập các đối tượng mà các luồng có thể thấy. Nếu mã chạy trong một luồng có thể truy cập một cá thể đối tượng hoặc dữ liệu tĩnh, nó có thể thay đổi nó. Nếu một luồng khác có thể thấy trường hợp đó hoặc dữ liệu tĩnh thì bạn đã truyền đạt giữa hai luồng. – djna