我正在阅读“Linux 设备驱动程序第 3 版”,关于并发和竞争条件的章节。有一个我不完全理解的例子;他们谈论的是内核编程中的一种常见模式,当需要在当前线程之外启动事件(例如,新内核线程或用户进程、对现有进程的请求或基于硬件的操作)时,等待该事件完全的。不是很有效的解决方案的例子是:
struct semaphore sem;
init_MUTEX_LOCKED(&sem);
start_external_task(&sem);
down(&sem);
然后他们建议外部任务在其工作完成时调用(&sem)。
我不明白为什么我们不能这样做:
struct semaphore sem;
down(&sem);
start_external_task(&sem);
为什么需要在锁定状态下创建互斥锁,然后在任务启动后获取互斥锁?
期待您的来信!谢谢。
最佳答案
当您调用 down() 时,您的线程将阻塞,直到另一个线程发出信号量信号为止。由于另一个线程尚未启动,该线程将无限期阻塞。这就是为什么你需要先启动线程,然后调用 down() 阻塞直到线程结束。
如果线程在您调用 down() 之前完成,那没关系,因为信号量将发出信号,而 down() 将简单地清除信号并返回。
关于c - Linux 内核互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757852/