首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >互斥锁、信号锁和自旋锁的区别

互斥锁、信号锁和自旋锁的区别
EN

Stack Overflow用户
提问于 2014-05-07 07:08:42
回答 3查看 46.5K关注 0票数 31

我正在用IPC做实验,特别是用Mutex,信号量和自旋锁。我学到的是互斥锁用于异步锁定(根据我在网上读到的睡眠机制),信号量是同步锁定(有信号和睡眠)机制,自旋锁是同步但非睡眠机制。

有人能帮我把这些东西弄清楚吗?另一个疑问是Mutex,当我用线程&互斥锁编写程序时,当一个线程运行另一个线程时,它不处于睡眠状态,而是不断地尝试获取锁。那么Mutex在睡觉还是不睡觉?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-05 00:58:38

首先,记住这些‘同步对象’的目标:

这些对象的设计是为了提供一个高效的协调的,在之间使用‘共享数据’--在一个进程之间或来自不同进程之间的线程超过一个。

这些对象可以是‘获取的’‘发布的’‘。

就这样!故事结束!

现在,如果这对你有帮助,让我把我的沙粒:

1)关键区段= User对象,用于仅允许在一个进程中执行来自许多其他线程的一个活动线程()。其他非选定线程(@获取此对象)被放置到sleep中。

没有进程间的能力,非常原始的对象。

2) Mutex信号量(又名Mutex)= Kernel对象,用于只执行来自其他许多进程的一个活动线程、一个进程中的或不同进程之间的。其他非选定线程(@获取此对象)被放置到sleep中。该对象支持线程所有权、线程终止通知、递归(来自同一线程的多个“获取”调用)和“优先级反转避免”。

进程间能力,非常安全的使用,一种“高级”同步对象。

3)计数信号量(又名信号量)= Kernel对象,用于允许执行来自许多其他进程的一组活动线程()、一个进程中的或不同进程之间的。其他非选定线程(@获取此对象)被放置到sleep中。

但是,进程间能力的使用并不安全,因为它缺少以下“互斥”属性:线程终止通知、递归、“优先级反转避免”等。

4)现在,谈到“自旋锁”,首先是一些定义:

临界Region=由两个或更多进程共享的内存区域。

Lock=值允许或拒绝进入“临界区域”的变量。(它可以实现为一个简单的‘布尔标志’)。

繁忙的waiting=会继续测试变量,直到出现某个值。

最后:

自旋锁(又称自旋锁)=A lock,它使用繁忙等待。(获取锁是由xchg或类似的原子操作完成的)。

没有线程休眠,主要用于内核级别。用户级代码的定义。

最后,我不确定,但我可以向您打赌,上面的前3同步对象(#1、#2和#3)使用这个简单的野兽(#4)作为它们实现的一部分。

祝你今天过得愉快!

参考资料:

-“嵌入式系统的实时概念”,作者:李清丽和卡罗琳·姚(CMP图书)。

-Modern操作系统(第三版)由Andrew (培生教育国际)。

-Programming应用程序为Microsoft (第4)由杰弗里里希特(微软编程系列)。

票数 67
EN

Stack Overflow用户

发布于 2014-05-07 07:46:08

下面是对信号量和互斥量之间区别的一个很好的解释:

http://blog.feabhas.com/2009/09/mutex-vs-semaphores---第1部分-信号量/

简短的答案与所有权有关,至少与二进制信号量有关,但我建议您阅读整篇文章。

票数 2
EN

Stack Overflow用户

发布于 2022-05-21 16:31:45

互斥量是锁定机制,信号量是等待和信号机制。两者都有不同的应用程序。

IISC教授给出了一个很好的解释。

视频链接

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

https://stackoverflow.com/questions/23511058

复制
相关文章

相似问题

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