2012-10-17 34 views

Trả lời

7

Không, bản đồ tuyên bố lock tới System.Threading.Monitor.Enter() (MSDN) và không có quá tải chấp nhận tham số ưu tiên.

Điều gần nhất tôi có thể nghĩ là ReaderWriterLock (Slim) nhưng tôi nghiêm túc xem xét lại thiết kế dẫn đến yêu cầu này. Có lẽ có những cách tốt hơn để đạt được những gì bạn cần.

2

Thông qua tuyên bố khóa gốc, không. Thông qua cơ chế khóa tùy chỉnh của riêng bạn, chắc chắn, nếu bạn sẵn sàng dành thời gian và công sức để phát triển nó.

Đây là bản nháp của tôi là giải pháp. Nó có thể hoặc có thể không hoạt động, và có thể không siêu hiệu quả, nhưng nó ít nhất là một nơi bắt đầu:

public class Lock 
{ 
    bool locked = false; 

    private object key = new object(); 
    SortedDictionary<int, Queue<ManualResetEvent>> notifiers = 
     new SortedDictionary<int, Queue<ManualResetEvent>>(); 

    ManualResetEvent specialNotifier = null; 

    public void Lock() 
    { 
     lock (key) 
     { 
      if (locked) 
      { 
       ManualResetEvent notifier = new ManualResetEvent(false); 

       int priority = getPriorityForThread(); 

       Queue<ManualResetEvent> queue = notifiers[priority]; 
       if (queue == null) 
       { 
        queue = new Queue<ManualResetEvent>(); 
        notifiers[priority] = queue; 
       } 

       queue.Enqueue(notifier); 

       notifier.WaitOne(); 
      } 
      else 
      { 
       locked = true; 
      } 
     } 
    } 

    private static int getPriorityForThread() 
    { 
     return 0; 
    } 

    public void Release() 
    { 
     lock (key) 
     { 
      foreach (var queue in notifiers.Values) 
      { 
       if (queue.Any()) 
       { 
        var notifier = queue.Dequeue(); 
        notifier.Set(); 
        return; 
       } 
      } 
      locked = false; 
     } 
    } 
} 
+0

Chỉ cần tò mò, là có bất cứ lý do này không thể sử dụng IDisposable? – wwahammy

+0

@wwahammy Không có lý do gì, không. – Servy

1

Đây là một giải pháp khác. Tôi có rất nhiều dòng, nhưng nó khá đơn giản. Hàm DoSomethingSingle sẽ chỉ được gọi là một chuỗi tại một thời điểm và các đối tượng có cờ highPriority sẽ nhận được tùy chọn.

static int numWaiting = 0; 
    static object single = new object(); 

    ResultType DoSomething(string[] argList, bool highPriority = false) 
    { 
     try 
     { 
      if (highPriority) 
      { 
       Interlocked.Increment(ref numWaiting); 
      } 

      for (;;) 
      { 
       lock (single) 
       { 
        if (highPriority || numWaiting == 0) 
        { 
         return DoSomethingSingle(argList); 
        } 
       } 
       // Sleep gives other threads a chance to enter the lock 
       Thread.Sleep(0); 
      } 
     } 
     finally 
     { 
      if (highPriority) 
      { 
       Interlocked.Decrement(ref numWaiting); 
      } 
     } 
    } 

Điều này cho phép hai mức độ ưu tiên. Đảm bảo rằng một chuỗi ưu tiên thấp sẽ chỉ được truy cập vào tài nguyên nếu không có chủ đề ưu tiên cao nào chờ đợi nó.

chỉnh sửa: thay đổi khóa liên incr/dec

Các vấn đề liên quan