Is này sử dụng đúng Thread.MemoryBarrier()?
No. Giả sử một chủ đề đặt cờ trước vòng lặp thậm chí bắt đầu thực thi. Vòng lặp vẫn có thể thực hiện một lần, sử dụng giá trị được lưu trong bộ nhớ cache của cờ. Có phải là chính xác không? Nó chắc chắn có vẻ không chính xác với tôi. Tôi hy vọng rằng nếu tôi thiết lập cờ trước khi thực hiện đầu tiên của vòng lặp, rằng vòng lặp thực hiện không lần, không một lần.
Theo như tôi hiểu Thread.MemoryBarrier(), có cuộc gọi này bên trong vòng lặp while sẽ ngăn luồng công việc của tôi lấy phiên bản được lưu trong bộ nhớ cache của shouldRun và ngăn chặn có hiệu quả vòng lặp vô hạn xảy ra. Sự hiểu biết của tôi về Thread.MemoryBarrier có đúng không?
Rào cản bộ nhớ sẽ đảm bảo rằng các xử lý không làm bất cứ reorderings của đọc và viết như vậy mà một truy cập bộ nhớ đó là logic trước rào cản thực sự là quan sát được sau nó, và ngược ngược lại.
Nếu bạn là địa ngục cúi đầu làm mã khóa thấp, tôi sẽ có khuynh hướng làm cho trường biến động hơn là giới thiệu một rào cản bộ nhớ rõ ràng. "dễ bay hơi" là một tính năng của ngôn ngữ C#. Một tính năng nguy hiểm và kém hiểu, nhưng là một tính năng của ngôn ngữ. Nó rõ ràng giao tiếp với người đọc của mã rằng lĩnh vực trong câu hỏi sẽ được sử dụng mà không có khóa trên nhiều chủ đề.
đây có phải là cách hợp lý để đảm bảo rằng vòng lặp của tôi sẽ dừng lại một lần shouldRun được đặt thành false bởi bất kỳ chuỗi nào không?
Một số người sẽ coi nó là hợp lý. Tôi sẽ không làm điều này trong mã của riêng tôi mà không có một lý do rất, rất tốt.
Thông thường các kỹ thuật khóa thấp được chứng minh bằng các cân nhắc hiệu suất. Có hai cân nhắc như vậy:
Đầu tiên, khóa bị khóa có khả năng cực kỳ chậm; nó chặn miễn là có mã thực hiện trong khóa. Nếu bạn có một vấn đề về hiệu suất bởi vì có quá nhiều tranh chấp thì trước tiên tôi sẽ cố gắng giải quyết vấn đề bằng cách loại bỏ sự tranh chấp. Chỉ khi tôi không thể loại bỏ ganh đua, tôi sẽ đi đến một kỹ thuật khóa thấp.
Thứ hai, có thể là khóa không được giám sát quá chậm. Nếu "công việc" bạn đang làm trong vòng lặp mất ít hơn 200 nano giây thì thời gian cần thiết để kiểm tra khóa không bị khóa - khoảng 20 ns - là một phần đáng kể thời gian làm việc. Trong trường hợp đó tôi sẽ đề nghị bạn làm nhiều công việc hơn cho mỗi vòng lặp. Có thực sự cần thiết rằng vòng lặp dừng trong vòng 200 ns của cờ điều khiển được thiết lập?
Chỉ trong trường hợp cực đoan nhất về các tình huống hiệu suất, tôi có thể tưởng tượng rằng chi phí kiểm tra khóa không được kiểm soát là một phần đáng kể thời gian trong chương trình.
Và tất nhiên, nếu bạn đang gây ra rào cản bộ nhớ cứ sau 200 ns, bạn cũng có thể làm hỏng hiệu suất theo những cách khác. Bộ vi xử lý muốn để làm cho các tối ưu hóa bộ nhớ di chuyển-trong-thời gian di chuyển cho bạn; nếu bạn buộc phải liên tục từ bỏ những tối ưu hóa đó, bạn đang bỏ lỡ một chiến thắng tiềm năng.
Không khai báo boolean như làm bay hơi giống nhau cả thôi? Tôi không chắc chắn về Thread.MemoryBarrier do đó bình luận không trả lời. ví dụ. http://www.albahari.com/threading/part4.aspxAnother> "một cách nâng cao hơn để giải quyết vấn đề này là áp dụng từ khóa dễ bay hơi vào trường _complete. Từ khóa dễ bay hơi chỉ thị trình biên dịch tạo ra một hàng rào có được trên mọi đọc từ lĩnh vực đó, và một hàng rào phát hành trên mỗi viết cho lĩnh vực đó ". Trân trọng, –
Dễ bay hơi là một điều rất độc ác và không nên được sử dụng: http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part -three.aspx – Steven
Lol, tôi không biết điều đó! Là một lập trình viên C/asm cũ, tôi nghĩ rằng đó là một điều tốt :) Cảm ơn bạn đã liên kết, tôi sẽ xem xét. –