gpt4 book ai didi

linux - 内核空间中的生产者/消费者——Linux

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:26 26 4
gpt4 key购买 nike

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

有没有人已经做过或知道怎么做?

我已经尝试了互联网上的几个教程,但没有一个真正运行良好。他们要么错过请求,导致系统锁定/不稳定,要么就是不终止。

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

谢谢!

最佳答案

您可以使用工作队列。工作队列很简单,设置工作队列后,您可以使用如下内容:

DECLARE_WORK(name, void (*function)(void *), void *data);

您的函数调用将在稍后安排和调用,请查看this article .

我也强烈推荐你这本书:Linux Device Drivers

编辑:我刚刚看到您已经链接了一个他们使用工作队列的 SO 帖子。你试过了吗?你遇到了一些问题?我建议您从一个非常简单的示例开始,只是为了尝试它是否有效。稍后实现您的核心功能。

更新:来自official Documentation :

Some users depend on the strict execution ordering of ST wq. The combination of @max_active of 1 and WQ_UNBOUND is used to achieve this behavior. Work items on such wq are always queued to the unbound worker-pools and only one work item can be active at any given time thus achieving the same ordering property as 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)))

关于linux - 内核空间中的生产者/消费者——Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19750918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com