Linux内核互斥体

Mar*_*ark 6 c linux multithreading kernel

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

struct semaphore sem;
init_MUTEX_LOCKED(&sem);
start_external_task(&sem);
down(&sem);
Run Code Online (Sandbox Code Playgroud)

然后他们建议外部任务在其工作完成时调用(&sem).

我不明白为什么我们不能这样做:

struct semaphore sem;
down(&sem);
start_external_task(&sem);
Run Code Online (Sandbox Code Playgroud)

为什么有必要在锁定状态下创建互斥锁,然后在任务启动后获取互斥锁?

期待您的回音!谢谢.

Ant*_*bry 10

当你调用down()时,你的线程将阻塞,直到另一个线程发出信号信号.由于其他线程尚未启动,线程将无限期地阻塞.这就是为什么你需要先启动线程,然后调用down()来阻塞直到线程完成.

如果线程在你调用down()之前完成,那没关系,因为信号量将被发信号并且down()将简单地清除信号并返回.

  • +1,但我认为使用术语`semaphore`而不是`mutex`会更好.SEMAPHORE:可以通过任何线程上/下.MUTEX:拥有所有权,只有锁所有者线程才能启动互斥锁.在这种情况下,我们需要使用信号量,因为它的目的是线程之间的通信...... (6认同)