免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2258 | 回复: 5
打印 上一主题 下一主题

[C] 感觉现在的互斥锁不是真正意义上的锁住数据不让其他线程访问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-21 18:19 |只看该作者 |倒序浏览
本帖最后由 iw1210 于 2013-01-21 18:42 编辑

感觉现在的互斥锁不是真正意义上的锁住数据不让其他线程访问。

假设两个线程A和B,要锁的数据是: int  D;

现在锁的意思很简单,只是“我现在用这个锁呢,别人想用就在那等我用完吧”,A线程和B线程都要有这样的表达:

pthread_mutex_lock(&mutex);
操作数据D...
pthread_mutex_unlock (&mutex);


真正锁的意义应该是“我现在正使用这些数据,别人想访问这些数据,等我不用了再给你”。
比如A线程这样锁住数据D后:
Lock{D};    // 注意是花括号不是圆括号

B线程里即使只有一条执行语句:
D = 9;
也实现了锁住D的功能。因为前面A已经把D锁住了,B执行到这条语句时不能继续,只能等A执行:
Unlock{D};
把D解锁后才能继续。

是不是这样的锁更好些呢? 抛砖引玉~~~


论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2013-01-21 18:26 |只看该作者
回复 1# iw1210

Java的synchronize不就是这样么?为什么一定要OS实现这个功能?

论坛徽章:
0
3 [报告]
发表于 2013-01-21 18:31 |只看该作者
本帖最后由 iw1210 于 2013-01-21 18:32 编辑
windoze 发表于 2013-01-21 18:26
回复 1# iw1210

Java的synchronize不就是这样么?为什么一定要OS实现这个功能?


OS实现不更好么?这样用户对锁能更好理解些,使用也方便了

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2013-01-21 18:45 |只看该作者
这个好困难,OS也搞不定啊,
要CPU锁住总线(总线控制器)对某地址的访问才行,
此外,如果一两个还好说,成千上百个可如何锁啊

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2013-01-21 18:50 |只看该作者
@windoze
java是因为它是解释的,所以很容易实现Mutex,
但很多原生的语言要CPU支持的,java不能什么都搞定阿

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2013-01-21 18:54 |只看该作者
的确,OS能锁内存,但是需要锁住的不止是内存,而是这段内存所代表的资源。
这个资源搞不好是程序自定义的,也不一定就全放在某段内存里,比如说一个指针指向别的什么地方、一个下标指向某个全局数组里的某个元素……
在这种情况下,OS有天大的本领也帮不了你
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP