免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Aquester

long类型需要加锁吗? [复制链接]

论坛徽章:
0
发表于 2008-12-19 19:40 |显示全部楼层

这些都源于数据共享

对共享数据的访问,CPU硬件与软件都会用到数据同步技术,
只是针对的数据颗粒不同而已。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2008-12-19 20:19 |显示全部楼层
原帖由 fineamy 于 2008-12-19 19:21 发表

加锁与操作串行化是两马事吧。
无论加锁同步还是串行化都是由于数据共享导致的,用于解决不同的问题。

对一个操作总是可以拆分成一组原子操作序列。
加锁是将这个操作原子化,
CPU内部共享内存的访问一 ...

呵呵,其实可以同时读写的器件是存在的,只是提个醒,与本讨论无关,呵呵

论坛徽章:
0
发表于 2008-12-19 20:43 |显示全部楼层
原帖由 freearth 于 2008-12-19 12:51 发表
如果读写的是一个计算机的字(对齐的),这样也没有关系。同一个Memory中的字不可能同时进行读写,总线的arbitrater会公平地调度不同的处理器,两个操作仍然是串行的。

不对啊,是串行的,可是你也不知道谁先谁后啊,也不能保证每次都是先读还是先写。也就是不能保证逻辑上读到的是不是脏数据。

[ 本帖最后由 prolj 于 2008-12-19 20:56 编辑 ]

论坛徽章:
0
发表于 2008-12-19 20:53 |显示全部楼层

回复 #12 cjaizss 的帖子

呵呵,这个我知道。
多端口MEMORY用的还是很多的。
实际上寄存器组RF从宏观上看就是一多入多出的MEMORY.

论坛徽章:
0
发表于 2008-12-19 21:21 |显示全部楼层

多端口

memory恰好就是解决共享数据问题的一个方案。
互斥访问串行化也是方法,
具体问题具体分析,用在不同的场合,

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2008-12-19 21:50 |显示全部楼层
互斥的作用在于把几个非原子的动作拼接的仿佛是原子,以之来避免一些时序的出现。
锁在信息技术里到处会出现,无论是硬件,还是软件。
软件里表现为信号量等,硬件里表现为外部或者内部的使能信号。
各个领域,CPU设计、分布式软件、多进程线程资源共享.....
只要是有生产者、消费者,就会有锁的存在。
to prolj,如果在同一个总线上,必须要有先后,总线无论是用轮盘赌的方式仲裁还是优先级仲裁,等等,无论哪种方式,最多只能有一方驱动总线。而如果在不同的总线上,双口器件可以允许在同一clock对同一数据进行读写,数字设计里可以采用锁存器的方式来保证读的数据那边短时间不会被写的数据污染。

论坛徽章:
0
发表于 2008-12-19 23:56 |显示全部楼层

回复 #16 cjaizss 的帖子

恩,你说的是硬件上的细节。受教了。
我的意思这种代码在不同的机器上行为不一样,还是加锁放心,谁知道那个机器怎么仲裁啊。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2008-12-20 00:06 |显示全部楼层
如果是I/O操作都是原子的,且只有一读一写,对于具体程序应用而言,机器如何仲裁都无所谓,因为你没有需要避免的时序,也就是任何时序你都接受,那么就不需要锁了。除非像我之前举的例子那样,虽然I/O原子,但我不能B先读,A再写,B再根据读到的数据来做另外一个原子或非原子操作这样的时序存在。

[ 本帖最后由 cjaizss 于 2008-12-20 00:08 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2008-12-20 00:15 |显示全部楼层
原帖由 cjaizss 于 2008-12-20 00:06 发表
如果是I/O操作都是原子的,且只有一读一写,对于具体程序应用而言,机器如何仲裁都无所谓,因为你没有需要避免的时序,也就是任何时序你都接受,那么就不需要锁了。除非像我之前举的例子那样,虽然I/O原子,但我 ...

而像之前我举的这个例子

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #define MAX 100000000
  5. volatile int x=0;
  6. void* thread(void* arg)
  7. {
  8.         int i;
  9.         for(i=0;i<MAX;i++)
  10.                 x++;
  11. }
  12. int main()
  13. {
  14.         pthread_t id1,id2;
  15.         pthread_create(&id1,NULL,thread,NULL);
  16.         pthread_create(&id2,NULL,thread,NULL);
  17.         pthread_join(id1,NULL);
  18.         pthread_join(id2,NULL);
  19.         printf("%d\n",x);
  20.         return 0;
  21. }
复制代码

不一定会得到两倍MAX值
是因为x++不是原子操作
它由至少取地址上的存储,加一回写两个原子操作组成。
假设为a和b操作
线程为A,B
那么只要有
Aa,B....,Ab(中间全都是B线程的操作)
Ba,A....,Bb(中间全都是A线程的操作)
这样的时序存在,结果就不会正确,而在没有锁的情况下,这样的时序是很可能出现的

论坛徽章:
0
发表于 2008-12-20 00:16 |显示全部楼层

回复 #16 cjaizss 的帖子

数据共享,生产-消费关系实则是数据依赖性的表现。
双口器件,
哈弗结构的指令数据分开寻址等消除数据依赖性,是一种主动策略。
软件技术上,完全没有数据依赖性的两部分程序就认为是正交的,这个可以按时间分,也可以在“空间”上分。
程序进程,线程技术将程序化成时间上正交的几部分来执行也是消除数据依赖性。
多CPU希望能在程序空间上划分,如2CPU核可以认为是二维的。
但是很可惜,这方面还不是很成熟,往往多核CPU的利用率很低。这方面主要还是用于并行计算。
这些都是主动消除数据依赖性,期望更大的并行性。
锁,同步,仲裁等可以说也是用于消除依赖性,只不过是一种消极的策略。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP