Có cơ chế khóa đọc/ghi hoạt động trên các quy trình (tương tự như Mutex, nhưng đọc/ghi thay vì khóa độc quyền) không? Tôi muốn cho phép truy cập đọc đồng thời, nhưng truy cập ghi độc quyền.Quy trình đồng bộ hóa đọc-ghi chéo trong .NET.
Trả lời
No. Như Richard đã lưu ý ở trên, không có cơ chế hộp trong .NET. Đây là cách để thực hiện nó bằng cách sử dụng một mutex và một semaphore.
Phương pháp # 1 được mô tả trong http://www.joecheng.com/blog/entries/Writinganinter-processRea.html, trích dẫn:
// create or open global mutex
GlobalMutex mutex = new GlobalMutex("IdOfProtectedResource.Mutex");
// create or open global semaphore
int MoreThanMaxNumberOfReadersEver = 100;
GlobalSemaphore semaphore = new GlobalSemaphore("IdOfProtectedResource.Semaphore", MoreThanMaxNumberOfReadersEver);
public void AcquireReadLock()
{
mutex.Acquire();
semaphore.Acquire();
mutex.Release();
}
public void ReleaseReadLock()
{
semaphore.Release();
}
public void AcquireWriteLock()
{
mutex.Acquire();
for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++)
semaphore.Acquire(); // drain out all readers-in-progress
mutex.Release();
}
public void ReleaseWriteLock()
{
for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++)
semaphore.Release();
}
Một thay thế sẽ là:
đọc khóa - như trên. Viết khóa như sau (giả):
- Lock mutex
- Busy loop until the samaphore is not taken AT ALL:
-- wait, release.
-- Release returns value;
-- if value N-1 then break loop.
-- yield (give up CPU cycle) by using Sleep(1) or alternative
- Do write
- Release mutex
Nó phải được lưu ý rằng cách tiếp cận hiệu quả hơn là có thể, như ở đây: http://en.wikipedia.org/wiki/Readers-writers_problem#The_second_readers-writers_problem Hãy tìm dòng chữ "Giải pháp này là tối ưu" trong bài viết ở trên.
System.Threading.Mutex có một mutex có thể được sử dụng cho truyền thông trong quá trình. Nếu bạn muốn chức năng mà nó không hỗ trợ, nó có thể được thực hiện thông qua một mutex.
Bạn có biết bất kỳ mẫu nào thực hiện một mutex đọc/ghi không? – Jeremy
Anh chàng này nói rằng nó thực sự là không thể: http://stackoverflow.com/questions/1008726/win32-read-write-lock-using-only-critical-sections –
@PavelRadzivilovsky Câu hỏi đó nói rằng nó không thể được thực hiện mà không có sử dụng ít nhất một đối tượng cấp hạt nhân, như một mutex. – McKay
Windows không bao gồm quy trình chéo Khóa Reader-Writer. Một sự kết hợp của Semaphore và Mutex có thể được sử dụng để xây dựng (Mutex được tổ chức bởi một nhà văn độc quyền truy cập hoặc bằng một Reader mà sau đó sử dụng Semaphore để phát hành độc giả khác. . Tuy nhiên, nếu tranh chấp được dự kiến sẽ thấp (tức là không có chủ đề nào giữ khóa lâu) thì sự loại trừ lẫn nhau vẫn có thể nhanh hơn: sự phức tạp thêm của khóa trình đọc ghi đè bất kỳ lợi ích nào cho phép nhiều người đọc đọc. (Khóa người đọc sẽ chỉ nhanh hơn nếu có nhiều người đọc và khóa hơn được giữ trong thời gian quan trọng — nhưng chỉ hồ sơ của bạn mới có thể xác nhận điều này.)
+1 cho ghi chú hiệu suất –
- 1. Làm cách nào để đồng bộ hóa hai quy trình?
- 2. Đồng bộ hóa bộ hẹn giờ để ngăn chồng chéo
- 3. .NET ThreadPool QueueUserWorkItem Đồng bộ hóa
- 4. Đồng bộ hóa chủ đề .NET
- 5. Thư viện đồng bộ hóa tệp .NET
- 6. Làm cách nào để đồng bộ hóa quá trình thực hiện quy trình Phụ huynh/Con?
- 7. cài đặt đồng bộ hóa chung "tự động đồng bộ hóa" hộp kiểm lập trình
- 8. Đồng bộ hóa quy tắc lưu hành động nhật thực
- 9. đồng bộ hóa (this) vs đồng bộ hóa (MyClass.class)
- 10. Đồng bộ hóa cuộc gọi không đồng bộ trong C#
- 11. Tệp không đồng bộ IO trong .Net
- 12. lập trình đồng bộ hóa các db trong Django
- 13. Android: Đồng bộ hóa với chuỗi trình kết xuất OpenGL
- 14. Đồng bộ hóa IMAP
- 15. Ngăn vòng lặp đồng bộ hóa mạng khi đồng bộ hóa từ mạng trong Android ContentProvider
- 16. Mẫu thiết kế đồng bộ hóa đồng bộ hóa tối ưu hóa
- 17. Đồng bộ hóa trong Vectors trong Java
- 18. XmlReader không đồng bộ trong .NET?
- 19. Đồng bộ hóa địa chỉ trong iOS
- 20. Đồng bộ hóa kiểu Etherpad trong Meteor?
- 21. Java đồng bộ hóa trong mẫu đơn
- 22. Thao tác đồng bộ hóa trong Silverlight
- 23. Đồng bộ hóa Android strings.xml
- 24. Thuật toán đồng bộ hóa
- 25. Semaphore và đồng bộ hóa
- 26. Đồng bộ hóa SQL 2012
- 27. Đồng bộ hóa với RestKit
- 28. Bộ sưu tập được đồng bộ hóa
- 29. Lỗi đồng bộ hóa Windows Mobile
- 30. EJB và Đồng bộ hóa
Quy trình chéo hoặc chuỗi chéo? –
@Albin - quy trình chéo. – Jeremy
Bạn có tìm thấy giải pháp nào không? – Bipul