c – Linux内核互斥体

前端之家收集整理的这篇文章主要介绍了c – Linux内核互斥体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在阅读“ 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()将简单地清除信号并返回.

原文链接:https://www.f2er.com/c/115774.html

猜你在找的C&C++相关文章