Ứng dụng có chuỗi phụ trợ. Chủ đề này không có nghĩa là để chạy tất cả các thời gian, nhưng quá trình chính có thể gọi nó rất thường xuyên. Vì vậy, câu hỏi của tôi là, điều gì là tối ưu hơn về hiệu năng CPU: đình chỉ chủ đề khi nó không được sử dụng hoặc giữ cho nó còn sống và sử dụng chức năng WaitForSingleObject để chờ tín hiệu từ quá trình chính?Đặt chủ đề có giữ tối ưu không?
Trả lời
Về nguồn tài nguyên CPU được sử dụng, cả hai giải pháp đều giống nhau - chuỗi bị treo và chuỗi đang đợi trong WaitForSingleObject cho đối tượng không được báo hiệu cả hai đều không có chu kỳ CPU.
Điều đó nói rằng, WaitForSingleObject là hầu như luôn luôn là một giải pháp ưa thích vì mã sử dụng nó sẽ được nhiều hơn "tự nhiên" - dễ đọc hơn, và dễ dàng hơn để làm cho quyền. Việc treo/tiếp tục chuỗi có thể nguy hiểm, vì bạn cần phải cẩn thận để đảm bảo bạn biết rằng bạn đang tạm dừng một chuỗi trong trạng thái tạm dừng nó sẽ không gây hại (hãy tưởng tượng tạm dừng một chuỗi đang nắm giữ một mutex).
Bạn có ý gì khi "tạm dừng"? WaitForSingleObject sẽ tạm dừng chuỗi, tức là, nó sẽ không tiêu thụ bất kỳ CPU nào, cho đến khi tín hiệu đến.
Nếu đó là một chuỗi công nhân có đơn vị công việc được trao cho nó bên ngoài, nó chắc chắn sẽ sử dụng các đối tượng báo hiệu vì điều đó sẽ đảm bảo nó không sử dụng CPU một cách không cần thiết.
Nếu nó có bất kỳ công việc riêng của mình để làm là tốt, đó là một vấn đề khác. Tôi sẽ không đình chỉ các chủ đề từ thread khác (những gì sẽ xảy ra nếu có hai chủ đề cung cấp công việc cho nó?) - Nguyên tắc cơ bản của tôi là chủ đề nên kiểm soát cuộc đời của mình với các đề xuất từ chủ đề khác. Điều này bản địa hóa tất cả các điều khiển trong chính chuỗi đó.
Tôi cho rằng Andrei không sử dụng Delphi để viết .NET và do đó Suspend không dịch sang System.Threading.Thread.Suspend nhưng thành SuspendThread Win32 API.
Tôi thực sự khuyên bạn nên chống lại nó. Nếu bạn tạm dừng chuỗi trong một thời điểm tùy ý, thì bạn không biết điều gì sẽ xảy ra (ví dụ, bạn có thể tạm dừng luồng trong trạng thái như vậy mà một số tài nguyên được chia sẻ bị chặn). Tuy nhiên, nếu bạn đã biết rằng luồng đang ở trạng thái tạm dừng, thì chỉ cần sử dụng WaitForSingleObject (hoặc bất kỳ cuộc gọi WaitFor nào khác) - nó sẽ có hiệu quả như việc tạm dừng chuỗi, tức là luồng sẽ sử dụng thời gian CPU 0 cho đến khi nó được đánh thức.
Xem hướng dẫn tuyệt vời về đa luồng trong Delphi: Multi Threading Tutorial
Một tùy chọn khác sẽ là TMonitor giới thiệu trong Delphi năm 2009, trong đó có chức năng như Đợi, Pulse và PulseAll để giữ chủ đề không hoạt động khi không có gì là làm cho họ và thông báo cho họ ngay khi họ tiếp tục công việc của họ. Nó được mô hình lỏng lẻo sau khi khóa đối tượng trong Java. Giống như ở đó, đối tượng Delphi bây giờ có một "khóa" lĩnh vực mà có thể được sử dụng cho synchrinozation thread.
Một blog mà đưa ra một ví dụ cho một lớp hàng đợi luồng có thể được tìm thấy tại http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/
Thật không may là có một lỗi trong việc thực hiện TMonitor, mà dường như được cố định trong XE2
- 1. Chủ đề ưu tiên Vs Chủ đề không ưu tiên
- 2. Chèn có tối ưu không?
- 3. Có chủ đề Biểu thức tối cho WPF DataGrid không?
- 4. Cách đặt chủ đề tối holo trong ứng dụng Android?
- 5. Thực hiện đơn đặt hàng tối ưu
- 6. Thiết lập RAID tối ưu cho máy chủ SQL
- 7. Có thể tối ưu hóa chức năng này không?
- 8. Chủ đề ưu tiênPoolExecutor trong Java (Android)
- 9. Thiết kế đa luồng có tối ưu hóa tốt không?
- 10. Giảm thiểu tổng khoảng cách: Vấn đề tối ưu hóa
- 11. Tối ưu hóa Xóa trên Máy chủ SQL
- 12. Có phương pháp tối ưu nào để đặt hàng chỉ mục tổng hợp MYSQL không?
- 13. Eclipse CDT đa luồng gỡ lỗi không tối ưu - làm thế nào để chạy một chủ đề độc quyền?
- 14. Đặt chủ đề làm nền hoặc không
- 15. Chủ đề Android không được đặt
- 16. Mã này có thể được tối ưu hóa không?
- 17. Tối ưu hóa CALayer?
- 18. Tôi có thể tối ưu hóa bản sao Mercurial không?
- 19. Có thể đặt cờ python -O (tối ưu hóa) trong một tập lệnh không?
- 20. Bạn muốn giải quyết vấn đề tối ưu hóa nào?
- 21. Tôi có hiểu chính xác tối ưu hóa sớm không?
- 22. Tối ưu hóa protobuf nào?
- 23. Không thể tối ưu hóa bảng innoDB
- 24. tối ưu hóa quadprog
- 25. Scala có hỗ trợ tối ưu đệ quy đuôi không?
- 26. PHP có tích hợp trình tối ưu hóa không?
- 27. Oracle 10g - tối ưu hóa KHÔNG CÓ NULL
- 28. Trình biên dịch có tối ưu hóa điều này không
- 29. Điều gì có thể làm cho mã F # không được tối ưu hóa nhanh hơn mã được tối ưu hóa?
- 30. Cài đặt WebView tối ưu cho hỗ trợ HTML5?