6

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.

+0

Quy trình chéo hoặc chuỗi chéo? –

+0

@Albin - quy trình chéo. – Jeremy

+0

Bạn có tìm thấy giải pháp nào không? – Bipul

Trả lời

4

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.

-1

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.

+1

Bạn có biết bất kỳ mẫu nào thực hiện một mutex đọc/ghi không? – Jeremy

+0

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 –

+0

@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

-2

Bạn đã xem System.Threading.ReaderWriteLock chưa? Đây là liên kết MSDN.

+1

Đó không phải là quá trình – Zippit

+1

Ah. Misuderstood câu hỏi (vẫn còn trên cốc cà phê đầu tiên). Tôi sẽ để lại điều này trong vài phút và sau đó xóa nó. – AllenG

5

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.)

+0

+1 cho ghi chú hiệu suất –

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