2009-05-27 37 views
5

Có cách nào được khuyến nghị để chờ nhiều lần nhập liệu hay không. Ví dụ: tôi muốn chương trình của tôi có thể nhận dữ liệu đầu vào từ 3 nguồn:Đang chờ trên nhiều sự kiện C++

Nghe trên điều kiện luồng, ví dụ: pthread_cond_wait()

Lấy dữ liệu từ đầu vào Chuẩn, ví dụ: getline()

Nghe trên ổ cắm, ví dụ: accept()

Cách tốt nhất để thực hiện việc này là gì? Tôi có cần một chuỗi cho mỗi nguồn đầu vào khác nhau không? Cảm ơn

+0

Có lý do cho điều này có thể là không cần thiết. Tôi nên có chủ đề chính chỉ chờ điều kiện. Chuỗi "Đầu vào bên ngoài" bằng cách sử dụng select() để đợi trên đầu vào ổ cắm và tệp. Sau đó, cả hai chủ đề con và "đầu vào bên ngoài" chủ đề có thể kích thích các chủ đề chính bằng cách sử dụng điều kiện. –

Trả lời

4

Bạn có thể nghe trên nhiều mô tả tệp mà không cần sử dụng nhiều chủ đề bằng cách sử dụng cuộc gọi hệ thống select(2). Bạn có thể sử dụng pthread_cond_timedwait để chờ một biến điều kiện với thời gian chờ, chẳng hạn như bạn không chờ đợi nhiều hơn một khoảng thời gian cụ thể.

Tôi nghĩ rằng rất bất thường khi muốn chờ đồng thời trên biến điều kiện hoặc bộ mô tả tệp của một số loại - nếu bạn hoàn toàn chắc chắn rằng đó là những gì bạn muốn làm, bạn sẽ phải sử dụng nhiều chuỗi , với một chuỗi gọi là pthread_cond_wait/pthread_cond_timedwait và chủ đề khác gọi select hoặc một số chức năng I/O khác.

+8

Nó chỉ là bất thường vì bạn không thể làm điều này (dễ dàng) trên unixes. Nó rất phổ biến trong win32, nơi chờ đợi trên nhiều thứ (tay cầm ổ cắm, hàng đợi chủ đề, semaphores, whatnot) là không có trí tuệ. – nos

0

Chắc chắn có vẻ như là mặc dù ba tùy chọn nhắn tin khác nhau này loại trừ lẫn nhau cho một chuỗi; làm thế nào một thread có thể đọc từ stdin trong khi nó chờ đợi cho một điều kiện thread?

Nếu bạn thực sự không muốn sinh ra ba luồng, tùy chọn duy nhất tôi có thể hiểu được là bằng cách nào đó sửa đổi hoặc tham số hóa chuỗi, luồng và thư viện socket để tham chiếu đến đối tượng đồng bộ hóa.

7

Không cần chủ đề riêng lẻ chờ accept(2)stdin - sử dụng poll/select tại đây. Thay vì biến điều kiện, tạo một đường ống giữa các chủ đề (bạn đã có chủ đề nếu chúng ta nói về CV), hãy đợi nó trong cùng một poll và ghi vào nó khi sự kiện xảy ra.

3

Trên Linux hiện đại, cách tốt nhất để làm điều này là không sử dụng pthread_cond_wait. Chỉ cần sử dụng eventfd để thay thế, cho phép bạn nghe nhiều sự kiện bằng cách chọn select/poll/epoll.

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