Thật khó để nói vấn đề chính là gì trong trường hợp của bạn, nhưng nó chắc chắn không phải là một cái gì đó có thể được sửa chữa với một cuộc gọi đến sched_yield()
hoặc pthread_yield()
. Việc sử dụng duy nhất được xác định rõ ràng cho năng suất, trong Linux, là cho phép một luồng sẵn sàng khác nhau để ngăn chặn luồng đang chạy CPU đang chạy ở cùng mức độ ưu tiên trên cùng một CPU theo chính sách lập lịch biểu SCHED_FIFO. Đó là một quyết định thiết kế kém trong hầu hết các trường hợp.
Nếu bạn nghiêm túc về mục tiêu "cố gắng là thời gian thực" trong Linux, thì trước tiên, bạn nên sử dụng cài đặt sched_setscheduler
thời gian thực (SCHED_FIFO hoặc SCHED_RR, FIFO được ưu tiên). Thứ hai, nhận bản vá đầy đủ miễn phí cho Linux (từ kernel.org nếu bản phân phối của bạn không cung cấp bản phát hành. Nó cũng sẽ cung cấp cho bạn khả năng lên lịch lại trình điều khiển thiết bị và thực thi chủ đề của bạn cao hơn, chẳng hạn như ổ đĩa cứng hoặc trình điều khiển ethernet. Thứ ba, xem RTWiki và các tài nguyên khác để biết thêm các gợi ý về cách thiết kế và thiết lập một ứng dụng thời gian thực.
Điều này sẽ đủ để giúp bạn dưới 10 vi giây thời gian phản hồi, bất kể tải hệ thống trên bất kỳ hệ thống máy tính để bàn nào. Tôi có một hệ thống nhúng, nơi tôi chỉ ép ra 60 phản hồi của chúng tôi nhàn rỗi và 150 chúng tôi dưới đĩa nặng/tải hệ thống, nhưng nó vẫn là đơn đặt hàng của cường độ nhanh hơn so với những gì bạn mô tả.
"gây chậm trễ đến một phần mười giây" Tôi thực sự nghi ngờ rằng ngữ cảnh chuyển đổi bởi hệ điều hành đang trì hoãn bạn 100 mili giây. Tôi cá là có điều gì đó đang diễn ra ở đây. – JonM
Nếu bạn muốn có thời gian đáp ứng ổn định, bạn thực sự cần các chuỗi RT (và, có thể là hạt nhân hỗ trợ RT) – osgx