0

我想让一个线程在请求​​队列中对一些请求进行排队,另一个线程来服务这些请求。当有新的请求排队时,生产者应该唤醒消费者。

有没有人已经这样做或知道如何做到这一点?

我在互联网上尝试了几个教程,但没有一个能真正干净地工作。他们要么错过请求,导致系统锁定/不稳定,要么只是不终止。

注意:我的问题本质上与类似。但是,我不会像提出这个问题的人那样具体。任何可以/愿意提供帮助的人都可以扔掉他的两分钱,也许我们可以解决一些问题。

谢谢!

4

2 回答 2

1

您可以使用工作队列。工作队列很简单,一旦你设置了你的工作队列,你就可以使用如下的东西:

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)))
于 2013-11-03T08:28:16.443 回答
0

Multicast Netlink 套接字可以在这里很好地工作。最近我也这样做了;唯一的区别是我的消费者在内核中,而生产者在用户空间中:同样可以在内核空间中使用。

于 2013-11-04T04:10:31.170 回答