当你有一组管道/套接字等待读/写时,可以使用epoll()或select()等待所有这些管道/套接字,直到其中至少有一个准备好进行读/写。
线程/ pthreads有什么类似的东西吗?我所做的最接近的是通过阻塞lock()来实现互斥。但是,这会花费每个锁的线程。
我还考虑过使用管道而不是这些锁,但它看起来效率也很低,而且管道数似乎限制在500左右(至少它比螺纹高一点)。
所以,是否有比使用线程等待互斥锁解锁更好的解决方案?
答案 0 :(得分:3)
eventfd
可能对您有用。它们的工作方式与管道相同,但开销要小得多。
如果你达到了1024个打开文件限制,你可以使用ulimit将它增加到你想要的数量。但是,如果你有很多锁,那么应该更加智能地使用eventfd。
答案 1 :(得分:1)
我不知道任何此类方法,但您可能想重新考虑导致此类问题的设计。如果你试图以非指定的顺序等待多个互斥体的可用性(可能在这个过程中锁定了一些互斥体),那么就餐哲学家的问题似乎很可能潜伏在附近。
如果这不是问题,那么条件变量可能就是这样。
答案 2 :(得分:0)
也许你正在寻找条件变量。请参阅pthread_cond_init,pthread_cond_wait和pthread_cond_signal的手册页。
如果一个线程调用pthread_cond_wait(cond),它会等到第二个线程调用pthread_cond_signal(cond)