Được rồi, vì vậy câu hỏi này không chính xác về quản lý chuỗi ... tốt, sắp xếp. Tôi đang tìm các giải pháp khác nhau cho cấu hình này. Tôi có một vài ý tưởng, nhưng tôi đang tìm kiếm bất kỳ giải pháp nào có thể đáp ứng được vấn đề. Và sẽ cân nhắc những ưu và khuyết điểm để thực hiện tốt nhất.Tôi cần phải thực hiện một cách để ngủ chủ đề này cho đến khi nó có tác dụng để làm
Đây là tình huống.
Tôi có một ứng dụng quản lý sẽ sinh ra một chuỗi. Chủ đề này sẽ liên tục chạy và xử lý giao tiếp nối tiếp với các bo mạch được kết nối với hệ thống qua USB. Ứng dụng quản lý tạo điều kiện giao tiếp giữa các ứng dụng khác đang chạy trên hệ thống và luồng này. Chủ đề cần phải thực sự thực hiện hai điều:
- Thăm dò bảng dữ liệu mẫu qua nối tiếp trên bộ định thời biến .. thường khoảng một lần một phút (bus nối tiếp chậm, baud là 4800. Tôi không thể kiểm soát điều này)
- Tạo điều kiện giao tiếp với ứng dụng của người quản lý. (tức là các ứng dụng khác sẽ yêu cầu dữ liệu mẫu, người quản lý chuyển tiếp yêu cầu tới chủ đề. chủ đề thực hiện thao tác và trả về dữ liệu)
Thiết kế ban đầu của tôi là một công việc đơn giản. Tôi sử dụng một hàng đợi và một mutex cho người quản lý để giao tiếp luồng. Vì vậy, logic của các chủ đề như sau:
- Khởi
- Trong khi chúng tôi chưa nhận được một lệnh tắt máy từ người quản lý
- Nếu hẹn giờ chúng tôi là lên, thăm dò ý kiến hội đồng quản trị cho dữ liệu
- Nếu không, kiểm tra xem liệu chúng tôi có thông báo do người quản lý đăng lên hàng đợi hay không. nếu có, hãy xử lý nó
Vấn đề là tôi không xem xét sử dụng CPU. 99,9% thời gian luồng của tôi không xử lý được gì và chỉ cần nhấc điện lên. Tôi cần phải thực hiện một cách để ngủ thread này cho đến khi nó có công việc để làm. Vì vậy, một vài ý tưởng:
Sử dụng chọn() để chặn. Điều này có thể chặn dựa trên bộ hẹn giờ tôi cần sử dụng và tôi có thể thay đổi cài đặt nhắn tin hàng đợi thành tin nhắn . Vì vậy, thay vào đó, các chủ đề sẽ mở một ổ cắm khách hàng để quản lý và người quản lý sẽ vượt qua các thông điệp trên socket đến các chủ đề . Sau đó, chọn() sẽ ngủ cho đến khi có hoạt động trên fd hoặc bộ hẹn giờ của tôi đã hết.
Pro: Chính xác chức năng tôi cần.
Con: Ổ cắm không phải là một quá trình xử lý nặng để giao tiếp với một chuỗi nơi bạn đã chia sẻ bộ nhớ chưa?
Sử dụng hệ thống tín hiệu. (Một người nào đó am hiểu hơn trong Linux có thể lên đường ở đây với một ví dụ thực hiện ... Tôi không chắc chắn làm thế nào để làm điều đó.) Nhưng thread có thể ngủ trong thời gian của bộ đếm thời gian, và thức dậy để xử lý nếu tín hiệu đã được nhận từ người quản lý.
Pro: Duy trì thực hiện hiện nay sử dụng bộ nhớ chia sẻ
Côn: Không chắc làm thế nào để thực hiện. Có một chức năng như select() mà làm việc với các tín hiệu thay vì fds?
Tiềm năng đột biến. Tôi có thể chặn cho đến khi một người quản lý đăng lên mutex.
Pro: Vẫn còn chia sẻ bộ nhớ
Côn: có thể cần phải di chuyển chế biến đếm thời gian để quản lý và điều đó thực sự không phải là một lựa chọn vì nó có tính giờ khác và công việc quan trọng để thực hiện.
Vui lòng giới thiệu và cảm thấy tự do để phê bình. Tôi mở cửa cho bất kỳ lựa chọn hiệu quả nào. Xin lưu ý rằng mặc dù điều này đang chạy trên một hệ thống nhúng, do đó việc sử dụng tài nguyên là rất quan trọng.
Tại sao không sử dụng biến có điều kiện khi bạn phải chờ một sự kiện? Chủ đề được đưa vào giấc ngủ cho đến khi biến được báo hiệu bởi một luồng khác. – Tudor
Tôi hoàn toàn có thể, nhưng vấn đề là tôi không muốn được xử lý bất cứ điều gì. Tôi không muốn liên tục kiểm tra giá trị của biến số sẽ thay đổi mỗi phút một lần. Đó là rất nhiều chi phí. Tôi muốn các thread ngủ để nó cho thời gian CPU. – linsek
Đảm bảo bạn tránh điều này: http://stackoverflow.com/questions/3886171/why-thread-sleep-is-so-cpu-intensive –