- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个多线程 epoll 服务器。我创建了一个 epoll fd,然后我将让 X 个线程休眠,等待 epoll_wait()
来自 SAME epoll fd 的任何事件。
现在我的问题是:如何唤醒 N 个线程,其中 N > 1 && N < X?
直到现在,我一直在使用 Linux 特定的 eventfd 工具,它只在 1 个线程上工作得很好,但现在有多个线程在等待 SAME epoll fd,出现了一个问题:
情况 1) LT:如果我将我的 eventfd 添加为“级别触发”模式,所有 线程将在我写入 eventfd 时唤醒,这就是级别触发模式的工作原理:一次fd 改变状态让我们唤醒所有线程。
N = X
情况 2) ET:如果我将我的 eventfd 添加为“边缘触发”模式,当我写入 eventfd 时,只有 1 线程将被唤醒,这就是边缘触发模式的工作原理: 在我从 read(eventfd, ...);
收到 EAGAIN
之前,不再有 epollfd 事件。
N = 1
案例 3)我也尝试过使用自管道技巧,向管道写入 N 次会唤醒 N 个线程。相反,它不会工作:它不可靠,有时一个线程从管道读取 2 个“ token ”,有时是 1 个或 3 个。
N = 随机
在我尝试过的所有情况下,我不能只得到 N=N,我不能只唤醒 N 个线程,而是 1 或 ALL,或 RANDOM。我错过了什么?有什么想法吗?注意:我还尝试了特定于 eventfd 的 EFD_SEMAPHORE
标志,没有任何帮助。
最佳答案
根据 eventfd手册页。
The file descriptor is readable (the select(2) readfds argument; the poll(2) POLLIN flag) if the counter has a value greater than 0.
通过创建带有 EFD_SEMAPHORE
标志的 eventfd:
(if) the eventfd counter has a nonzero value, then a read(2) returns 8 bytes containing the value 1, and the counter's value is decremented by 1.
使用信号量(EFD_SEMAPHORE
标志),NONBLOCK(EFD_NONBLOCK
标志)eventfd 并等待级别触发的 epoll()
,或普通的 poll()
。
使用 eventfd_write(fd, N)
编写 N 个线程你想醒来。
当线程唤醒时,您将执行 read()
。如果你得到 EAGAIN
错误,你可以回去 sleep 因为 N 次成功的读取已经完成并且因此 N 个线程知道它们必须保持清醒。
所有线程唤醒(thundering herd 问题)。
关于linux - 多线程 epoll 服务器 : wake up N threads sleeping on the same epoll fd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540910/
这个问题在这里已经有了答案: android: broadcast receiver for screen on and screen off (2 个答案) 关闭 10 年前。 对于工业应用程序,
我想从另一个 pthread 中唤醒一个 pthread - 但需要一段时间。我知道 signal 或 pthread_signal 与 pthread_cond_wait 可用于唤醒另一个线程,但我
有谁知道我将如何唤醒 Wear 屏幕?我正在运行振动 API: Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
我读了Linux Kernel Development这本书,对 sleep 和唤醒部分给出的例子有一些疑问。 DEFINE_WAIT(wait); add_wait_queue(q, &wait);
我有 3 个进程需要同步。进程一做某事然后唤醒进程二并休眠,进程二做某事然后唤醒进程三并休眠,进程三做某事并唤醒进程一并休眠。整个循环定时运行大约 25hz(由外部同步到进程一之前触发我的“真实”应用
我正在研究一种解决方案,通过 Wake On Lan 激活机器,然后 System Center 将更新推送到客户端电脑(运行 Windows 7)。 现在我正在编写一个脚本 (PowerShell/
我有一个用 Rust 编写的 Web 服务器,我想将其部署在 Heroku 上。服务器在我的机器上本地编译和运行良好(见下图),但是,它无法在 Rust 上编译,我得到一个编译错误。 error[E0
我正在使用 Box2d v2.3 以下 box2d 方法采用 bool "wake": inline void b2Body::ApplyLinearImpulse(const b2Vec2& imp
许多 Prolog 系统都有 freeze/2谓词,谓词 应该有名称 geler/2因为它是 甚至在 Prolog-II 之前发明。 假设我对同一个变量有一个条件,但有两个 不同的目标,即: ?-
我有一个由 Azure 服务总线队列触发的 Azure Function - Azure Function App 托管在消费计划中。 当队列中出现新消息时,唤醒 Azure Function 最多需
我们有一个简单的 Azure 函数来进行 DocumentDB 查询。好像第一次调用要等很长时间才能完成,然后连续调用就很快了。 例如,我刚刚打开我们的应用程序,第一个函数调用花费了 10760 毫秒
我正在制作一款用户与计算机对战的游戏。轮到玩家时,计算机对手会考虑下一步行动。如果玩家移动到计算机对手计划移动的位置,计算机对手将重新开始搜索它的移动。 下面是主函数和对手函数的概要: [更新] pt
能否请您告诉我,如何为 Android 制作 Wake On Lan 应用程序?我在谷歌上搜索了两个星期,尝试了所有方法,从另一个局域网唤醒应用程序下载了源代码,并试图找到用于制作和发送魔术包的代码。
假设我有一个 Azure Webjob 配置为单例,并在自由站点上下文中“连续”运行。根据Azure specifications ,从开始的一段时间后,网络作业将关闭,除非有人让它继续运行: As
在某些计算机上,网络适配器默认配置为关闭“允许此设备唤醒计算机”选项。因此,LAN 唤醒将不起作用。 我需要重新打开此选项,但我无法手动完成 - 电脑太多了!因此,我需要能够通过 API 或脚本来完成
Mavericks 对我的应用程序有太多“空闲唤醒”很生气。我知道这与计时器和 OS X 试图使我的应用程序更省电的方式有关。我如何调试这些空闲唤醒?或者有哪些可能的原因? 最佳答案 可能的原因是线程
我正在尝试为生产者-消费者问题编写代码。下面的代码大部分时间都可以正常工作,但有时会因为“丢失唤醒”而卡住(我猜)。我尝试了 thread sleep() 但它没有用。在我的代码中处理这种情况需要进行
我有以下方法: def _attempt(actor): if actor.__class__ != User: raise TypeError 从 View 中调用: sel
当我的计算机从低功耗模式唤醒时, 光标消失。 当我关闭它时,会出现一个光标。 我正在使用其他加速应用程序。 最佳答案 我认为您应该清理系统缓存。 您可以为此使用合适的清洁程序。 关于windows-1
我有一个管理器类,多个线程将自己注册到该类(使用 UUID 为每个请求生成唯一标识符),提供要处理的有效负载并从管理器获得相应的响应。我正在使用 java.util.concurrent.Execut
我是一名优秀的程序员,十分优秀!