Trong hầu hết các ngôn ngữ/khuôn khổ, có tồn tại một cách cho một luồng để kiểm soát các luồng khác. Tuy nhiên, tôi thực sự không thể nghĩ ra một thời điểm khi năng suất từ một sợi chỉ là giải pháp đúng cho một vấn đề nhất định. Khi nào, nói chung, bạn nên sử dụng Thread.yield()
, sleep(0)
, v.v ...?Khi nào thì một sợi chỉ nên mang lại?
Trả lời
Một trường hợp sử dụng có thể là để thử nghiệm các chương trình đồng thời, cố gắng tìm các khoảng trống cho biết các lỗ hổng trong các mẫu đồng bộ hóa của bạn. Ví dụ trong Java:
Một thủ thuật hữu ích cho tăng số lượng interleavings, và do đó hiệu quả hơn khám phá không gian trạng thái của chương trình của bạn, là sử dụng
Thread.yield
để khuyến khích bối cảnh nhiều hơn chuyển mạch trong hoạt động truy cập mà trạng thái được chia sẻ. (Hiệu quả của kỹ thuật này là nền tảng cụ thể, vì JVM được miễn phí để xử lý THRead.yield dưới dạng no-op [JLS 17.9]; sử dụng chế độ ngủ ngắn nhưng không phải là sẽ chậm hơn nhưng đáng tin cậy hơn.) - JCIP
Cũng thú vị từ quan điểm của Java xem là ngữ nghĩa họ không được định nghĩa:
Ngữ nghĩa của
Thread.yield
(vàThread.sleep(0)
) là không xác định [JLS 17,9]; JVM là miễn phí để thực hiện chúng như là không có ops hoặc xử lý chúng như gợi ý lập kế hoạch. Cụ thể, chúng không bắt buộc phải có các ngữ nghĩa về giấc ngủ (0) trên hệ thống Unix trong luồng hiện tại ở cuối của hàng đợi chạy cho ưu tiên đó, cho các chủ đề khác của ưu tiên tương tự cách này. - JCIP
Điều này khiến chúng trở nên không đáng tin cậy. Đây là rất Java cụ thể, tuy nhiên, trong chung tôi tin rằng sau là đúng:
Cả hai đều là cơ chế ở mức độ thấp mà thể được sử dụng để gây ảnh hưởng đến trật tự lịch. Nếu điều này được sử dụng để đạt được một chức năng nhất định thì chức năng này được dựa trên xác suất của bộ lập lịch hệ điều hành có vẻ là một ý tưởng khá tồi. Điều này nên được quản lý bởi các cấu trúc đồng bộ hóa cấp cao hơn thay thế.
Để kiểm tra mục đích hoặc để buộc chương trình vào một trạng thái nhất định, nó có vẻ là một công cụ hữu ích.
Giữ trình lên lịch cho hệ điều hành của bạn quyết định cho bạn?
Vì vậy, không bao giờ sinh lời và không bao giờ ngủ (0) cho đến khi bạn khớp với một trường hợp khi ngủ (0) là cần thiết một cách tuyệt đối và ghi lại ở đây.
Chuyển đổi ngữ cảnh cũng tốn kém nên tôi không nghĩ nhiều người muốn nhiều công tắc ngữ cảnh hơn.
'Vì vậy, không bao giờ có năng suất, và không bao giờ ngủ (0) cho đến khi bạn phù hợp với một trường hợp mà giấc ngủ (0) là hoàn toàn cần thiết và tài liệu ở đây.' - OH CHÚNG TÔI CÓ THỂ CÓ BABIES CÙNG NHAU? (Tôi la Đan ông). –
Khi nào, nói chung, bạn nên sử dụng Thread.yield(), sleep (0), v.v ...?
Nó phụ thuộc vào VM là mô hình chuỗi mà chúng ta đang nói đến.Đối với tôi câu trả lời là hiếm khi nếu có.
Theo truyền thống, một số mô hình chủ đề không được ưu tiên và một số khác là (hoặc đã) không trưởng thành do đó cần Thread.yield()
.
Tôi cảm thấy rằng Thread.yield()
giống như sử dụng register
trong C. Chúng tôi sử dụng để dựa vào nó để cải thiện hiệu suất của các chương trình của chúng tôi bởi vì trong nhiều trường hợp lập trình viên giỏi hơn trình biên dịch. Nhưng các trình biên dịch hiện đại là nhiều hơn thông minh hơn và ít hơn nhiều trong những ngày này, người lập trình có thể cải thiện hiệu suất của một chương trình với việc sử dụng register
và Thread.yield()
.
- 1. FBSession: chỉ nên được sử dụng từ một sợi đơn
- 2. Tại sao xargs -L mang lại định dạng đúng, trong khi xargs -n thì không?
- 3. Tại sao nên (mỗi chuỗi? []) Mang lại giá trị đúng?
- 4. Khi nào thì không nên sử dụng dịch vụ web?
- 5. Tạo ra một sợi chỉ trong python
- 6. Khi nào Akka sẽ mang lại hiệu suất tốt hơn?
- 7. Khi nào nên sao chép địa phương được đặt thành true và khi nào thì không?
- 8. Ngủ một sợi chỉ tăng cho một số nano giây
- 9. Khi nào tôi nên sử dụng async/await và khi nào thì không?
- 10. Khi nào thì dùng dup và khi nào thì dùng clone trong Ruby?
- 11. Khi nào thì gọi SaveChanges
- 12. Khi nào nên sử dụng dịch vụ dữ liệu WCF và khi nào thì không?
- 13. Khi nào nên sử dụng Class.isInstance() và khi nào thì sử dụng toán tử instanceof?
- 14. Ưu điểm của chức năng "áp dụng" là gì? Khi nào thì tốt hơn nên sử dụng hơn là "cho" vòng lặp, và khi nào thì không?
- 15. Thoát khỏi một sợi
- 16. Khi nào thì tốt hơn hết nên đóng các tay cầm tập tin?
- 17. Làm thế nào để mang lại một quá trình nền mồ côi trở lại Foreground?
- 18. Application.DoEvents, khi nào cần thiết và khi nào thì không?
- 19. Làm thế nào để một luồng.Thread mang lại phần còn lại của lượng tử trong Python?
- 20. Chỉ mục SQL Server nào nên được nhóm lại?
- 21. Khi nào nên sử dụng chế độ xem cơ sở dữ liệu và khi nào thì không?
- 22. C#: Dừng một sợi sau khi một ngoại lệ
- 23. Khi nào các chỉ mục cơ sở dữ liệu nên được xây dựng lại?
- 24. Khi nào thì bỏ qua MVVM?
- 25. Khi nào thì chức năng Win32 InterlockedExchange nên được sử dụng?
- 26. Khi nào thì muốn sử dụng OneTuple?
- 27. Khi nào thì nên sử dụng Bitwise Operators trong quá trình phát triển web?
- 28. mang lại các điều khiển được nạp lần cuối khi tôi khởi động lại máy
- 29. Khi nào thì một body onLoad được gọi?
- 30. Khi nào tôi nên sử dụng Bảng chỉ mục của Oracle? Hoặc, khi tôi không nên?
Quay lại khi tôi sử dụng để viết các hạt đa luồng trên đỉnh các hệ thống tác vụ đơn, tôi đã có một công cụ gỡ lỗi để kiểm soát thời gian timeslice cho chính xác mục đích này. Thật đáng kinh ngạc khi mã được cho là an toàn-luồng-nhiều-vấn đề sẽ sụp đổ khi bạn buộc một lệnh không cần thiết trước mỗi vài lệnh máy. Không có gì hữu ích được thực hiện ở tốc độ đó, nhưng bạn chắc chắn tìm thấy các lỗi! –
@RossPatterson Thật tuyệt khi được nghe về điều đó trong thực tế. –