2013-09-05 18 views
5

Tôi vừa học về lớp lồng vào nhau và nó được cho là nhanh hơn chỉ đơn giản là khóa. Bây giờ, đây là tất cả tốt đẹp và tốt, nhưng tôi tò mò muốn thực hiện. Theo như tôi biết, cách duy nhất để đảm bảo rằng hoạt động trên một biến được thực hiện một cách nguyên tử là đảm bảo rằng chỉ có một luồng có thể truy cập biến đó vào bất kỳ lúc nào trong thời gian. Đó là khóa.Công việc được khóa liên động như thế nào và tại sao nó lại nhanh hơn khóa?

Tôi đã sử dụng phản xạ để có được nguồn gốc của đan cài, nhưng có vẻ như nó sử dụng phương pháp bên ngoài để làm tất cả những công việc của mình:

[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
internal static extern int ExchangeAdd(ref int location1, int value); 

tôi đã chạy một số xét nghiệm, và đan cài trong thực tế là hai lần nhanh như chỉ đơn giản là khóa đối tượng và tăng nó.

Họ làm như thế nào?

+1

Hỗ trợ CPU .... – spender

+0

ý của bạn là gì? –

Trả lời

8

Khóa liên động có hỗ trợ ở cấp CPU, có thể thực hiện thao tác nguyên tử trực tiếp.

Ví dụ, Interlocked.Increment là một cách hiệu quả một XADD, và so sánh và hoán đổi (ví dụ: Interlocked.CompareExchange) được hỗ trợ thông qua CMPXCHG instructions (cả với một tiền tố LOCK).

+0

điều thú vị là - Tôi chỉ chạy thử nghiệm Interlocked vs ++. Đã khóa liên kết có vẻ nhanh hơn –

+0

@ArsenZahray Bạn đo điểm chuẩn như thế nào? Nếu bạn đang thực hiện nó trong quá trình gỡ lỗi hoặc dưới máy chủ thử nghiệm VS, điểm chuẩn của bạn sẽ bị xao lãng. –

+0

Tôi chạy từng hoạt động 100000000 lần. Và tôi chỉ chạy chương trình của tôi từ cmd và kết quả không thay đổi (khóa: 00: 00: 02.4291389, được khóa liên động: 00: 00: 01.1740671; ++: 00: 00: 01.4320819 –

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