Nếu có nhiều chủ đề chờ đợi trên cùng một khóa thì có thể có chủ đề Chính có ưu tiên cao hơn trong việc lấy khóa. Có nghĩa là nếu chủ đề công nhân đi đến câu lệnh lock
trước chủ đề chính, luồng chính sẽ lấy khóa trước các chủ đề khác đã đợi trên đó.C# có thể thay đổi mức độ ưu tiên của việc mua khóa không?
Trả lời
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.
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;
}
}
}
Đâ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
- 1. thay đổi mức độ ưu tiên của chuỗi gốc trên Android bằng c/C++
- 2. Thay đổi mức độ ưu tiên trong Log4j
- 3. Tôi có thể thay đổi mức ưu tiên của một quy trình trong Erlang không?
- 4. Hàng đợi ưu tiên có thể thay đổi đồng thời
- 5. Thay đổi mức độ ưu tiên của chuỗi tăng trong Windows
- 6. Thay đổi mức ưu tiên của chuỗi không có hiệu lực
- 7. Làm cách nào để thay đổi mức độ ưu tiên của một quy trình?
- 8. Cách an toàn để thay đổi mức độ ưu tiên của NSOperation
- 9. Cài đặt mức độ ưu tiên (ưu tiên) không có hiệu lực trên Linux
- 10. Cách đặt Mức độ ưu tiên của IntentService trong Android
- 11. Cách sửa đổi mức độ ưu tiên của hàng đợi GCD tùy chỉnh?
- 12. Làm cách nào để thay đổi mức ưu tiên của thư trong MSMQ?
- 13. Cách ưu tiên để tạo bản sao có thể thay đổi của đối tượng không thể thay đổi được?
- 14. Mức độ ưu tiên của chủ đề và Độ chính xác của chủ đề
- 15. Thư PHP() - Cách đặt mức độ ưu tiên?
- 16. Làm cách nào để khởi chạy quy trình có mức độ ưu tiên thấp? C#
- 17. Cách ưu tiên công việc?
- 18. Hạng mục công việc TFS: Xếp hạng xếp chồng so với mức độ ưu tiên?
- 19. Có một lớp heap trong C++ hỗ trợ thay đổi mức độ ưu tiên của các phần tử khác với phần đầu?
- 20. C Queue # ưu tiên
- 21. ưu tiên quá trình thay đổi trong android
- 22. Linux & C: Cách đặt mức độ ưu tiên đọc tệp trong chương trình đa tiến trình?
- 23. Tại sao có mức độ ưu tiên cho các toán tử như static_cast?
- 24. Thay đổi Ưu tiên JavaQueue thành Max PQ
- 25. Có cách nào để đặt mức độ ưu tiên của chuỗi nền được sử dụng bởi một SwingWorker không?
- 26. Đổi độ ưu tiên của quá trình hiện tại trong C
- 27. C++ điển ưu tiên
- 28. Tôi có thể đặt Powershell bắt đầu-công việc với ưu tiên thấp?
- 29. Chạy tác vụ ở chế độ nền với mức ưu tiên CPU thấp hơn
- 30. Có thể thay đổi kinh độ và vĩ độ không?
Chỉ cần tò mò, là có bất cứ lý do này không thể sử dụng IDisposable? – wwahammy
@wwahammy Không có lý do gì, không. – Servy