Vì vậy, đây là tiện ích tùy chỉnh của tôi cho khóa đã kiểm tra kép: đó là phương pháp tĩnh mà bạn cung cấp tiêu chí, đối tượng đồng bộ hóa và hành động được thực hiện.Có thể tạo một thử nghiệm cho thấy sự thất bại của việc kiểm tra khóa kép trong C# không?
public static bool RunIf(Func<bool> criterion, object syncObject, Action action)
{
if (criterion())
lock(syncObject)
if (criterion())
{
Thread.MemoryBarrier();
action();
return true;
}
return false;
}
Tôi trao cho hiểu rằng, theo C# đặc điểm kỹ thuật, nó có thể cho optimisers để sắp xếp lại cấp phát bộ nhớ theo cách như vậy đó, mà không có rào cản bộ nhớ, kỹ thuật này có thể cung cấp cho một dương tính giả và thực hiện hành động khi nó không nên. Trong thế giới nhỏ bé của tôi, nếu thất bại như vậy là có thể, nó cũng nên có thể đưa ra một thử nghiệm cho thấy sự thất bại một cách nhất quán bằng cách nhấn kịch bản đủ cứng với một số lượng đủ các trường hợp thử nghiệm song song. Tôi đã tìm kiếm một thử nghiệm như vậy trong khoảng một năm nay, nhưng cho đến nay tôi đã rút ra một khoảng trống. Bất kỳ ai có thể chỉ cho tôi một bài kiểm tra rằng:
cho thấy sự thất bại của phương pháp này khi không có hàng rào bộ nhớ;
cho thấy thành công của nó khi thử nghiệm được lặp lại với hàng rào bộ nhớ được khôi phục?
Tôi tin rằng .Net framework trên x86 có mô hình bộ nhớ mạnh hơn những gì đặc tả C# yêu cầu, vì vậy bạn sẽ không thể tạo thử nghiệm như vậy. Bạn có thể có nhiều may mắn hơn trên ARM (ví dụ: Windows RT), có mô hình bộ nhớ yếu hơn. – svick
svick là chính xác. Kiểm tra [bài viết MSDN này] (http://msdn.microsoft.com/en-us/magazine/cc163715.aspx#S5) nói về mô hình bộ nhớ mạnh hơn cho .Net 2+. –