workqueue
queue_work和schedule_work区别
`queue_work(system_unbound_wq, &pkt->work);` 和 `schedule_work(&pkt->work);` 都是用于将一个工作(work)加入到内核的工作队列中异步执行,但它们的工作队列不同,区别如下:
### 1. `schedule_work(&pkt->work);`
- 会把 `work` 加入到**默认的全局工作队列**(`system_wq`)。
- 这个队列是**有绑定CPU的**,即每个CPU有自己的worker线程,work会在某个CPU上执行。
- 适合大多数普通的异步任务。
### 2. `queue_work(system_unbound_wq, &pkt->work);`
- 会把 `work` 加入到**unbound工作队列**(`system_unbound_wq`)。
- 这个队列的worker线程**不绑定特定CPU**,work可以在任意CPU上调度执行。
- 适合对CPU亲和性要求不高、可能会阻塞或者需要高并发的任务。
### 总结
- `schedule_work(&work)` 等价于 `queue_work(system_wq, &work)`,用的是默认队列。
- `queue_work(system_unbound_wq, &work)` 用的是unbound队列,适合高并发或长耗时任务。
- 普通短任务用 `schedule_work` 即可;如果你希望任务不受CPU亲和性影响或有特殊并发需求,用 `system_unbound_wq`。
**参考:**
- [Linux kernel documentation - workqueue](https://www.kernel.org/doc/html/latest/core-api/workqueue.html)

浙公网安备 33010602011771号