2011-07-22 30 views
0

當您有一組等待讀/寫的管道/套接字時,可以使用epoll()或select()來等待所有這些管道/套接字,直到其中至少有一個準備好讀/寫。epoll/select for mutexes/semaphores

線程/線程有類似的東西嗎?我最近做的是通過在鎖()上阻塞互斥鎖來創建一個睡眠線程。但是,這會爲每個鎖定花費一個線程。

我也想過使用管道而不是這些鎖,但它似乎效率低下,管道數量似乎被限制在500管道左右(至少比管道高一點)。

所以是的,有沒有比使用線程等待互斥鎖解鎖更好的解決方案?

+0

我不知道您的需求量這裏 - 等待線程做..什麼?如果你只是想等到某個線程到達執行的某個點,那麼你可以在你的標題中提示一個常見的單一事件或信號量。一個事件會告訴你至少有一個線程已經到達觸發點,一個信號量可以讓你知道有多少線程到達了那裏。無論哪種情況,您都可以迭代線程(線程中的「就緒」布爾值),以找出哪些線程處於觸發點。你能再清楚一點嗎?你的要求? –

回答

1

我不知道任何這樣的方法,但你可能想重新考慮導致這樣一個問題的設計。如果您試圖以未指定的順序等待多個互斥鎖的可用性(可能會鎖定其中的一些互斥鎖),那麼Dining Philosophers問題似乎很可能潛伏在即。

如果這不是問題,那麼一個條件變量可能是要走的路。

0

也許你正在尋找條件變量。有關pthread_cond_init,pthread_cond_wait和pthread_cond_signal的信息,請參閱手冊頁。

如果一個線程調用調用pthread_cond_wait(條件),它等待,直到第二個線程調用pthread_cond_signal(條件)

2

eventfd可能對你有用的。他們應該像管道一樣工作,但開銷要小得多。

如果您打開1024個打開的文件限制,您可以使用ulimit將其增加到您想要的數量。但是,如果你有很多鎖,應該更聰明地使用eventfd。

這裏有更多的一些信息:http://man7.org/linux/man-pages/man2/eventfd.2.html