Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53545
  • 博文数量: 9
  • 博客积分: 350
  • 博客等级: 二等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 13:03
文章分类

全部博文(9)

文章存档

2011年(1)

2010年(8)

分类: C/C++

2011-04-16 15:43:11

好久没加班了,今天偶有兴致加个班,结果遇到了一个奇怪问题!!!
 
问题描述:
多线程程序,主线程有个u_int64_t var = i++;操作,这个i是主线程的局部变量,非竞争资源;程序运行一段时间后会出现var 值相同的情况。
 
问题分析:
以前看操作系统和编译原理是有点印象是 i++与++i是不同的,++i是一个原子操作(单挑INC汇编指令),而i++不是原子操作;即使是这样,操作系统应该会保护前一线程的上下文,不应该会出现这种情况的啊。。。费解。。。
 
结果:
把u_int64_t var = i++换成u_int64_t var = ++i后,运行正常
 
在这里记下以备日后查询。
阅读(2114) | 评论(1) | 转发(0) |
0

上一篇:[广告]支持Unix-center

下一篇:没有了

给主人留下些什么吧!~~

GFree_Wind2011-04-19 12:23:14

我认为不是简单的将i++改为++i的问题。你看我的测试代码。

int main()
{
    int i = 0;
    int a = ++i;
    int b = i++;

    return 0;
}
将其反汇编,

0x08048394 <main+0>:    push   %ebp
0x08048395 <main+1>:    mov    %esp,%ebp
0x08048397 <main+3>:    sub    $0x10,%esp
0x0804839a <main+6>: