我想让一个线程在请求队列中对一些请求进行排队,另一个线程来服务这些请求。当有新的请求排队时,生产者应该唤醒消费者。
有没有人已经这样做或知道如何做到这一点?
我在互联网上尝试了几个教程,但没有一个能真正干净地工作。他们要么错过请求,导致系统锁定/不稳定,要么只是不终止。
注意:我的问题本质上与此类似。但是,我不会像提出这个问题的人那样具体。任何可以/愿意提供帮助的人都可以扔掉他的两分钱,也许我们可以解决一些问题。
谢谢!
我想让一个线程在请求队列中对一些请求进行排队,另一个线程来服务这些请求。当有新的请求排队时,生产者应该唤醒消费者。
有没有人已经这样做或知道如何做到这一点?
我在互联网上尝试了几个教程,但没有一个能真正干净地工作。他们要么错过请求,导致系统锁定/不稳定,要么只是不终止。
注意:我的问题本质上与此类似。但是,我不会像提出这个问题的人那样具体。任何可以/愿意提供帮助的人都可以扔掉他的两分钱,也许我们可以解决一些问题。
谢谢!
您可以使用工作队列。工作队列很简单,一旦你设置了你的工作队列,你就可以使用如下的东西:
DECLARE_WORK(name, void (*function)(void *), void *data);
您的函数调用将在稍后安排和调用,请看这篇文章。
我也强烈推荐你这本书:Linux 设备驱动程序
编辑:我刚刚看到您已经链接了他们使用工作队列的 SO 帖子。你试过了吗?你遇到了一些问题?我建议你从一个非常简单的例子开始,只是想试试它是否有效。稍后实现您的核心功能。
更新: 来自官方文档:
一些用户依赖于 ST wq 的严格执行顺序。@max_active of 1 和 WQ_UNBOUND 的组合用于实现此行为。此类 wq 上的工作项始终排队到未绑定的工作池中,并且在任何给定时间只有一个工作项可以处于活动状态,从而实现与 ST wq 相同的排序属性。
这样,您的工作人员将有保证的 FIFO 执行。但请注意,工作可能在不同的 CPU 上执行。您必须使用内存屏障来确保可见性(例如wmb()
)。
更新:
正如@user2009594 提到的,可以使用linux/ workqueue.h 中定义的以下宏创建单线程 wq :
#define create_singlethread_workqueue(name) \
alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name)))
Multicast Netlink 套接字可以在这里很好地工作。最近我也这样做了;唯一的区别是我的消费者在内核中,而生产者在用户空间中:同样可以在内核空间中使用。