首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核互斥锁

问Linux内核互斥锁
EN

Stack Overflow用户
提问于 2011-01-21 18:45:52
回答 3查看 10.3K关注 0票数 6

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

代码语言:javascript
复制
struct semaphore sem;
init_MUTEX_LOCKED(&sem);
start_external_task(&sem);
down(&sem);

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

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

代码语言:javascript
复制
struct semaphore sem;
down(&sem);
start_external_task(&sem);

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

期待您的回音!谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-01-21 18:54:28

当您调用down()时,您的线程将阻塞,直到另一个线程向信号量发出信号。由于另一个线程尚未启动,因此该线程将无限期地阻塞。这就是为什么你需要先启动线程,然后调用down()来阻塞,直到线程结束。

如果线程在调用down()之前结束,这是可以的,因为信号量将被发信号,down()将简单地清除信号并返回。

票数 10
EN

Stack Overflow用户

发布于 2011-01-21 18:57:15

在第一个示例中,down(&sem)将等待external_task调用up(&sem),并有效地暂停主线程,直到任务完成。在您的代码中,down()将永远锁定主线程,因为还没有要调用up()的任务

票数 3
EN

Stack Overflow用户

发布于 2011-01-21 21:43:44

呼叫声:

代码语言:javascript
复制
init_MUTEX_LOCKED(&sem);

在“互斥模式”中创建一个初始化为0的新信号量。这意味着对down()的调用将被阻塞。相应的调用:

代码语言:javascript
复制
init_MUTEX(&sem);

将创建一个初始化为1的信号量。

在第一个示例中,您将信号量初始化为0,创建external_task并调用down()阻塞,直到您的任务调用up()。

在第二个例子中,你没有初始化你的信号量,调用down()阻塞执行,并且没有运行可以调用up()来解除阻塞的external_task。因此,创建external_task的调用永远不会到达。

顺便说一下,在内核版本2.6.37中删除了使用init_MUTEX_LOCKED初始化信号量的过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4757852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档