我正在用IPC做实验,特别是用Mutex,信号量和自旋锁。我学到的是互斥锁用于异步锁定(根据我在网上读到的睡眠机制),信号量是同步锁定(有信号和睡眠)机制,自旋锁是同步但非睡眠机制。
有人能帮我把这些东西弄清楚吗?另一个疑问是Mutex,当我用线程&互斥锁编写程序时,当一个线程运行另一个线程时,它不处于睡眠状态,而是不断地尝试获取锁。那么Mutex在睡觉还是不睡觉?
发布于 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)由杰弗里里希特(微软编程系列)。
发布于 2014-05-07 07:46:08
下面是对信号量和互斥量之间区别的一个很好的解释:
http://blog.feabhas.com/2009/09/mutex-vs-semaphores---第1部分-信号量/
简短的答案与所有权有关,至少与二进制信号量有关,但我建议您阅读整篇文章。
发布于 2022-05-21 16:31:45
https://stackoverflow.com/questions/23511058
复制相似问题