2008-09-25 25 views
7

Ứ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

14

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).

1

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.

1

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 đó.

6

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.

0

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

Các vấn đề liên quan