2011-07-21 40 views
8

Tôi nhận được câu hỏi về cách Monitor.Enter hoạt động. Tôi điều tra .net framework mã nguồn, và nó cho thấy đây chỉ:System.Threading.Monitor.Enter() hoạt động như thế nào?

[System.Security.SecurityCritical] // auto-generated 
    [ResourceExposure(ResourceScope.None)] 
    [MethodImplAttribute(MethodImplOptions.InternalCall)] 
    private static extern void ReliableEnter(Object obj, ref bool lockTaken); 

Tôi đoán thực hiện Monitor.Enter phụ thuộc nền tảng, vì vậy tôi duyệt mã nguồn Mono và tôi đã từ bỏ :(

Vâng, một phần quan trọng được gán cho mỗi thể hiện System.Object có thể giải quyết, nhưng, tôi không nghĩ rằng Monitor.Lock thực tế được viết như thế này, bởi vì việc tạo ra một phần quan trọng cho mỗi System.Object sẽ có chi phí không giới hạn (Win32 không cho phép hàng tỷ đối tượng phần quan trọng trong một quy trình!)

Có ai biết Monitor.Enter hoạt động như thế nào? Vui lòng trả lời. ance.

Trả lời

5

Nhìn vào mã nguồn Mono, có vẻ như chúng tạo Semaphore (sử dụng CreateSemaphore hoặc một chức năng nền tảng tương tự) khi đối tượng được khóa lần đầu tiên và lưu trữ nó trong đối tượng. Dường như có một số đối tượng tổng hợp đang diễn ra với các semaphores và các cấu trúc MonoThreadsSync liên quan của chúng.

Chức năng liên quan là static inline gint32 mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_interruption) trong tệp mono/metadata/monitor.c, trong trường hợp bạn quan tâm.

Tôi hy vọng rằng Microsoft .Net thực hiện điều tương tự.

2

Microsoft .NET - bất cứ khi nào có thể - hãy thử một spinlock trên cấu trúc khóa mỏng trong tiêu đề đối tượng. (Chú ý cách người ta có thể "khóa" trên bất kỳ đối tượng nào.)

Chỉ khi có nhu cầu, một xử lý sự kiện sẽ được sử dụng từ hồ bơi hoặc bộ phận mới được phân bổ.

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