epoll / select for mutexes / semaphores

时间:2011-07-22 06:07:06

标签: multithreading asynchronous

当你有一组管道/套接字等待读/写时,可以使用epoll()或select()等待所有这些管道/套接字,直到其中至少有一个准备好进行读/写。

线程/ pthreads有什么类似的东西吗?我所做的最接近的是通过阻塞lock()来实现互斥。但是,这会花费每个锁的线程。

我还考虑过使用管道而不是这些锁,但它看起来效率也很低,而且管道数似乎限制在500左右(至少它比螺纹高一点)。

所以,是否有比使用线程等待互斥锁解锁更好的解决方案?

3 个答案:

答案 0 :(得分:3)

eventfd可能对您有用。它们的工作方式与管道相同,但开销要小得多。

如果你达到了1024个打开文件限制,你可以使用ulimit将它增加到你想要的数量。但是,如果你有很多锁,那么应该更加智能地使用eventfd。

以下是一些信息:http://man7.org/linux/man-pages/man2/eventfd.2.html

答案 1 :(得分:1)

我不知道任何此类方法,但您可能想重新考虑导致此类问题的设计。如果你试图以非指定的顺序等待多个互斥体的可用性(可能在这个过程中锁定了一些互斥体),那么就餐哲学家的问题似乎很可能潜伏在附近。

如果这不是问题,那么条件变量可能就是这样。

答案 2 :(得分:0)

也许你正在寻找条件变量。请参阅pthread_cond_init,pthread_cond_wait和pthread_cond_signal的手册页。

如果一个线程调用pthread_cond_wait(cond),它会等到第二个线程调用pthread_cond_signal(cond)