我正在阅读“Linux设备驱动程序第3版”,这是有关并发和竞争条件的章节。有一个我不完全理解的例子。他们谈论的是内核编程中的一种常见模式,当需要在当前线程之外启动 Activity (例如,新的内核线程或用户进程,对现有进程的请求或基于硬件的操作)时,请等待该 Activity 。完全的。不是很有效的解决方案的示例是:

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/

10-11 16:30