Tôi đã cố gắng để lock
một biến Boolean
khi tôi gặp phải những lỗi sau:Tại sao chúng ta không thể khóa trên một loại giá trị?
'bool' không phải là một loại tài liệu tham khảo theo yêu cầu của báo cáo kết quả khóa
Dường như chỉ các loại tài liệu tham khảo là được phép trong các câu hỏi lock
, nhưng tôi không chắc tôi hiểu tại sao.
Andreas được nêu trong comment mình:
Khi [một loại giá trị] đối tượng được truyền từ một thread để người kia, một bản sao được thực hiện, vì vậy các chủ đề kết thúc làm việc trên 2 đối tượng khác nhau, trong đó an toàn.
Có đúng không? Điều đó có nghĩa là khi tôi làm như sau, tôi đang thực tế sửa đổi hai khác nhau x
trong xToTrue
và phương pháp xToFalse
?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(mã này một mình rõ ràng là vô dụng trong trạng thái của nó, nó chỉ là ví dụ)
Tái bút: Tôi biết về câu hỏi này trên How to properly lock a value type. Câu hỏi của tôi không liên quan đến số cách nhưng đến số lý do tại sao.
Chương trình của bạn không chuyển x giữa các chủ đề đang sử dụng bản sao được chia sẻ. Tuy nhiên nó vẫn không an toàn khi bạn không truy cập x trong phạm vi khóa và x không được khai báo dễ bay hơi. Tôi cảm thấy một câu hỏi khác liên quan đến: "Tại sao x trong ví dụ này cần phải dễ bay hơi?" –
@MartinBrown: Tôi biết, và trong mã * thực * của tôi, tôi sử dụng một khóa trên một đối tượng chuyên dụng (như tôi đã đề cập trong câu hỏi của mình, nó liên quan đến * tại sao * chứ không phải * cách *). Đối với 'biến động ', nó là [không cần thiết khi khóa đúng cách] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different- part-three.aspx). – Otiel