免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Aquester
打印 上一主题 下一主题

[C] 一个线程对long类型变量进行修改,多个线程只读这个long类型值,需要加锁吗? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-12-20 01:43 |只看该作者
原帖由 flw 于 2008-12-19 08:38 发表
自从俺用了 STM 和 Message Passing,就再也不用考虑锁的问题啦!
真痛快。

C 中有靠谱的STM麽?我看了几个也就tl2还不错,不过感觉也不是太靠谱。。。

论坛徽章:
0
42 [报告]
发表于 2008-12-20 19:06 |只看该作者
加不加锁是看你实际的情况。

如果你的读操作的值必须每次都正确,并且对你的后续操作有很关键的影响,加锁是必须的。举个不太准确但简单的例子:你的写操作是发一个命令:刹车。你的读操作根据这个值来判断是否刹车。那你肯定的保证每次读的这个值都正确,不然就会该刹车时不刹,不刹的时候刹了

如果读操作的值可以允许你在写操作的时候有误差,就可以不用加锁。又举个例子:你的写操作是控制更新一个音量值,读操作根据这个值改变实际的大小。那么读操作对于这个值要么是写之前,要么是写之后。对于要求不是很精确的控制是没有必要来加锁的。

论坛徽章:
0
43 [报告]
发表于 2008-12-20 21:50 |只看该作者
读写都需要加锁,开销非常小的

论坛徽章:
0
44 [报告]
发表于 2008-12-20 23:41 |只看该作者
可以不加锁,但需要使用原子操作,具体可以去看linux kernel的代码,简单来说x86上对long的读写是原子,但SMP下要加lock前缀锁总线,其他平台的可能有差异

论坛徽章:
0
45 [报告]
发表于 2008-12-21 09:40 |只看该作者
原帖由 drangon 于 2008-12-20 23:41 发表
可以不加锁,但需要使用原子操作,具体可以去看linux kernel的代码,简单来说x86上对long的读写是原子,但SMP下要加lock前缀锁总线,其他平台的可能有差异

感觉这个说得比较对

论坛徽章:
0
46 [报告]
发表于 2008-12-22 14:34 |只看该作者
原帖由 HbbT 于 2008-12-20 19:06 发表
加不加锁是看你实际的情况。

如果你的读操作的值必须每次都正确,并且对你的后续操作有很关键的影响,加锁是必须的。举个不太准确但简单的例子:你的写操作是发一个命令:刹车。你的读操作根据这个值来判断是 ...

同意,如果读写的顺序很重要的话,程序流程控制上就应该保证先后,只加锁是解决不了问题的,锁只能保证同一时间内只有一个线程进行访问,但不保证谁先谁后。

论坛徽章:
0
47 [报告]
发表于 2008-12-22 15:45 |只看该作者
看这个赋值操作是不是原子操作了,不是,有可能读到修改了一半的值。
一个操作是不是原子的,有没有权威的规定?
修改64位,32位,16位,8位的一个变量,哪个是原子操作?

论坛徽章:
0
48 [报告]
发表于 2008-12-22 22:01 |只看该作者

回复 #1 Aquester 的帖子

long counter = 0;
void thread1()
{
    counter = time(NULL);
}

线程2:
void thread2()
{
   printf("%ld\n", counter);
}

对于这个问题的原义,其实都不需要线程1的,也不用同步,直接用:
void thread2()
{
   printf("%ld\n", time(NULL));
}

论坛徽章:
0
49 [报告]
发表于 2008-12-22 22:48 |只看该作者
原帖由 richardyang 于 2008-12-22 22:01 发表
long counter = 0;
void thread1()
{
    counter = time(NULL);
}

线程2:
void thread2()
{
   printf("%ld\n", counter);
}

对于这个问题的原义,其实都不需要线程1的,也不用同步,直接用:
...

这位兄弟说得不错,是直接可以
printf("%ld\n", time(NULL));
不过误会问题的意思了,问题只是举这样一个例子,实际需求是不能这样做的。

论坛徽章:
0
50 [报告]
发表于 2008-12-25 17:11 |只看该作者

肯定需要的啊

绝对要
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP