这里我们来看看Linux中是如何使用同步机制来实现复杂的多任务同步的
首先来介绍一下这个例子
有一个内核共享资源(链表),同时有三种不同类型的内核任务会访问该链表,并对其进行插入或者删除节点的操作,内核线程负责向链表加入新节点,内核定时器负责定时/删除节点,而系统调用负责在某个时刻销毁整个链表。这三种内核任务并发执行时,有可能会破坏链表数据的完整性,所以我们必须对链表进同步访问保护,以确保数据的一致性。在这样一个多任务并发访问的模型中,我们需要选用合适的内核同步机制来管理这些任务,使得它们能够有条不紊的执行。主要用到的工具有:信号量/自旋锁/工作队列/内核定时器
当用户初始化一个工作队列时,内核就开始为用户分配一个workqueue工作队列对象,并且将其链到一个全局的workqueue队列中,然后linux会根据当前CPU的情况为工作队列对象分配与CPU个数相同的cpu_workqueue_struct,也就是CPU工作队列对象,每个CPU工作队列对象都会有一条任务队列,linux会为每一个cpu工作队列对象分配一个内核线程ÿ