epoll/select 用于互斥体/信号量

Posted

技术标签:

【中文标题】epoll/select 用于互斥体/信号量【英文标题】:epoll/select for mutexes/semaphores 【发布时间】:2011-07-22 06:07:05 【问题描述】:

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

threads/pthreads 有什么类似的吗?我最接近的方法是通过阻塞互斥锁的 lock() 来创建一个休眠线程。但是,这会为每个锁花费一个线程。

我也想过用管道代替这些锁,但也似乎效率低下,而且管道数似乎限制在 500 条左右(至少比线程高一点)。

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

【问题讨论】:

我不确定您的要求 - 等待线程执行.. 什么?如果您只想等到某个线程在其执行中到达某个点,您可以只发出一个常见的、单个事件或信号量的信号,正如您在标题中暗示的那样。一个事件会告诉你至少一个线程已经到达你的触发点,一个信号量可以让你知道有多少线程已经到达那里。在任何一种情况下,您都可以迭代线程(线程中的“就绪”布尔值),以找出哪些线程处于触发点。你能再清楚一点吗?你的要求? 【参考方案1】:

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

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

这里有更多信息:http://man7.org/linux/man-pages/man2/eventfd.2.html

【讨论】:

【参考方案2】:

我不知道任何此类方法,但您可能需要重新考虑导致此类问题的设计。如果您试图以未指定的顺序等待多个互斥锁的可用性(可能在此过程中锁定其中一些),那么“哲学家进餐”问题似乎很可能就在拐角处潜伏。

如果这不是问题,条件变量可能是要走的路。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于epoll/select 用于互斥体/信号量的主要内容,如果未能解决你的问题,请参考以下文章

监视器与互斥体

Linux 并发与竞争(原子操作自旋锁信号量互斥体)

信号量互斥体和自旋锁

关键部分与计数信号量有什么关系?

如何在 Ruby 和另一种语言之间共享文本文件(或互斥体/信号量)?

Linux内核并发与竞争-互斥量