2009-05-27 76 views
5

是否有推薦的方法來等待多個輸入。例如,我希望我的程序能夠接收3個來源的輸入:等待多個事件C++

聽線程條件例如pthread_cond_wait()

從標準輸入獲取數據例如, getline()

在插座上聆聽例如accept()

完成此操作的最佳方法是什麼?我是否需要針對每個不同輸入源的線程?謝謝

+0

是的原因可能是不必要的。我應該讓主線程等待條件。使用select()等待套接字和文件輸入的「外部輸入」線程。然後,子線程和「外部輸入」線程可以使用該條件激勵主線程。 – 2009-05-27 16:25:49

回答

4

您可以使用select(2)系統調用在多個文件描述符上收聽而不使用多個線程。您可以使用pthread_cond_timedwait等待帶有超時的條件變量,以便您不會等待超過特定的時間量。

我認爲想要同時等待條件變量或某種文件描述符是非常不尋常的 - 如果您確信這就是您想要做的,那麼您將不得不使用多個線程,其中一個線程調用pthread_cond_wait/pthread_cond_timedwait,另一個線程調用select或其他一些I/O函數。

+8

這只是不尋常的,因爲你不能在unix上這麼做(很容易)。這在win32中很常見,在這裏等待多件事情(套接字句柄,線程隊列,信號量,whatnot)是一件容易的事情。 – nos 2009-07-19 02:22:13

0

它似乎好像這三個不同的消息傳遞選項是相互排斥的單線程;單線程在等待線程條件時如何從標準輸入讀取數據?

如果你真的不想產生三個線程,我唯一能找到的選擇是以某種方式修改或參數化線程,流和套接字庫以引用同步對象。

7

不需要單獨的線程等待accept(2)stdin - 在這裏使用poll/select。在線程之間創建一個管道(如果我們談論CV,則已經有線程),請在相同的poll上等待,並在事件發生時寫入。

3

在現代Linux上,最好的方法是不要使用pthread_cond_wait。只需使用eventfd,這將使您能夠使用select/poll/epoll監聽多個事件。