2012-06-27 18 views
10

Tôi cố gắng để sử dụng spinlock, nhưng ngay cả mã cơ bản nhất này trong một ứng dụng điều khiển đơn luồng ném ngoại lệ sau khi tôi callSpinLock.Exit()spinlock ném SynchronizationLockException

System.Threading.SynchronizationLockException was unhandled by user code 
    Message=The calling thread does not hold the lock. Source=mscorlib 

Dưới đây là toàn bộ mã nguồn. ..

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication48 
{ 
    class Program 
    { 
     static readonly SpinLock SpinLock = new SpinLock(); 
     static void Main(string[] args) 
     { 
      bool lockTaken = false; 
      try 
      { 
       SpinLock.Enter(ref lockTaken); 
       if (lockTaken) 
        Console.WriteLine("Lock taken"); 
      } 
      finally 
      { 
       if (lockTaken) 
        SpinLock.Exit(); 
      } 
      Console.WriteLine("Done"); 
     } 
    } 
} 
+0

Thông báo cho biết khóa không thuộc sở hữu của cùng một chuỗi đang gọi Thoát - nhưng từ mã rõ ràng là. –

Trả lời

14

SpinLock là cấu trúc và bạn đang đọc từ trường chỉ đọc. Thông số C# nói rằng trong trường hợp này, để gọi hàm có khả năng đột biến, cấu trúc phải được sao chép sang biến cục bộ có thể thay đổi. Điều này xảy ra dưới bìa.

Cuộc gọi đến và vào diễn ra trên bản sao khóa mới của bạn. Vì lý do đó, Enter đang hoạt động trên một khóa mở khóa.

Đừng biến biến SpinLock thành chỉ đọc bởi vì nó đang bị biến đổi.

+0

Ah, do đó, sử dụng "chỉ đọc" với loại giá trị không chỉ xác định rằng trường không thể gán được mà còn ngụ ý rằng giá trị không thay đổi và để đảm bảo giá trị này sao chép giá trị khi bạn đọc. Cảm ơn –

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