2013-02-01 32 views
6

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

6

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.

+0

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! –

+0

@RossPatterson Thật tuyệt khi được nghe về điều đó trong thực tế. –

3

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.

+1

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

3

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 registerThread.yield().

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