Linux 中断上下文不允许睡眠,当遇到可能会进睡眠状态的上下文时,可以把任务放在工作队列(workqueue)中。
工作队列(workqueue)如何使用?
// 工作队列的定义
struct dev_work {
struct work_struct work;
struct device *dev;
char *name;
}
struct dev_wrok device_wk;
struct workqueue_struct *devcie_workqueue = NULL;
// 工作对列初始化
static int __init mDevice_init(void)
{
// 用于创建workqueue,只创建一个内核线程。输入参数:@name:workqueue名称
devcie_workqueue = create_signlethread_workqueue("dev_crash_workqueue");
if (devcie_workqueue != NULL) {
INIT_WORK(&(device_wk.work), mdev_crash_report_cb); // 绑定工作队列的回调函数
}
}
arch_initcall(mDevice_init);
// 工作队列的调度
// 当工作任务来时,可以通过queue_work()来调起工作队列执行它的回调函数
void my_work()
{
// do something you need before the workqueue
if (devcie_workqueue) {
queue_work(devcie_workqueue , &(device_wrok.work)); // 调用起工作队列
}
}
// 注销工作队列
destroy_workqueue(devcie_workqueue);
参考:http://blog.chinaunix.net/uid-24148050-id-296982.html