c - Linux 内核互斥量

标签 c linux multithreading kernel

我正在阅读“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/

相关文章:

c - 同时执行 2 个不同的函数,pthread 是我的答案吗?

复杂的视频在开始之前需要一个基本的简单测试

linux - 我们如何添加应用程序远程启动(Linux)

multithreading - 多线程 alpha-beta 剪枝的效果如何?

c++ - 用户提供的 terminate() 函数必须是线程安全的吗?

c - 如何将单个字节放入网络字节顺序?

c - 如何使用 dtrace 查看调用堆栈

返回比 Linux `wc -l` 高得多的行数的 Python 代码

python - 在 crontab 上运行 python 脚本导致权限错误,但通过终端运行没问题

c++ - 多线程和多进程的性能差异