Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161894
  • 博文数量: 17
  • 博客积分: 1056
  • 博客等级: 少尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-08 23:27
文章分类

全部博文(17)

文章存档

2012年(1)

2011年(1)

2009年(4)

2008年(11)

我的朋友

分类: C/C++

2008-07-14 20:17:56

今天 看到一道百度笔试题
以下多线程对int型变量x的操作,哪几个需要进行同步:
A. x=y;         B. x++;         C. ++x;            D. x=1;
 
最初有人说选B 因为操作了2个寄存器。答案:ABC
 
后面干脆将代码汇编了。
得到
A:
        movl    $1, -4(%ebp)
        movl    -4(%ebp), %eax
        movl    %eax, -8(%ebp)
B:
        movl    $1, -4(%ebp)
        leal    -4(%ebp), %eax
        incl    (%eax)
C:
        movl    $1, -4(%ebp)
        leal    -4(%ebp), %eax
        incl    (%eax)
D:
        movl    $1, -4(%ebp)
 
我们看到ABC都对2个寄存器进行操作。
 
下表是一个多线程加锁的规律表
 操作的结果与初值无关  操作的结果与初值相关
 写简单数据类型  不需要加锁①  需要加锁②
 写复杂数据类型  需要加锁③  需要加锁④
 读简单数据类型  不需要加锁⑤  不需要加锁⑥
 读复杂数据类型  需要加锁⑦  需要加锁⑧
 
可以同样看到ABC都是写简单数据类型 并且操作的结果与初值相关。所以需要加锁。即要求同步
第2种情况的典型代表是“i++;”,需要对它加锁是因为它表面上虽然只有一条语句,却要执行至少两个操作,一是读出i的初始, 二是把加一后的结果写回去,两个操作就没有“原子性”了,所以需要加锁.
 

 
 
阅读(7047) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

gtkmm2008-07-20 00:53:28

B,C不用加锁. 虽然是二条语句,但第一条改变的是寄存器内容,在线程恢复执行时会被系统恢复,没有必要加锁. 答案为A.