免费注册 查看新帖 |

Chinaunix

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

对int变量的赋值是原子操作吗? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2006-08-09 11:03 |显示全部楼层
count++应该是一条指令。
我觉得FLW的程序思路有问题。
如果把线程函数改成:

  1. void *incCount( int id )
  2. {
  3.     int i,j;

  4.         printf( "Hello, I am pthread %d\n", id );
  5.         for( i=0; i<1000; i++ ){
  6.                 for(j=0; j<50000;j++)
  7.                         count++;
  8.         }

  9.         printf( "[%d] Done.\n", id );
  10.         return NULL;
  11. }
复制代码


则最后结果总为1000×50000×6.

速度慢的机子需要调整i,j值,保证在main printf count之前线程全部执行完毕。

[ 本帖最后由 assiss 于 2006-8-9 11:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-08-09 11:14 |显示全部楼层
我知道FLW的程序错在哪了。
就是线程里的那句:count=0;

当6个线程一起执行的时候,他那里count++刚到888,你这里给它来个归零,全乱套了。

论坛徽章:
0
3 [报告]
发表于 2006-08-11 14:53 |显示全部楼层
弱弱地问一句:什么是原子的?
你们争论的让人觉得似乎不是同一个问题。

系统调用是原子的吗?

另外,思一克版主在第9页的程序思路也有些问题:
count = k;
v = count;
if((v & 0x0000ffff) != (v >> 16)) {
这个不等,恐怕只会出现在按字节赋值等情况下(比如51单片机等int与地址位数不等)----无论count被怎么改,无论v被怎么改,最后v肯定属于0x11111111*[1,6],v & 0xffff 肯定 等于v>>16.

论坛徽章:
0
4 [报告]
发表于 2006-08-11 17:16 |显示全部楼层
请问,到底什么是原子的?
以系统调用为例,哪个系统调用可以说是原子的?

以write(fd=STDERR_FILENO, buff, len=4)为例,
假设write需要2个mov就可以完成(多么有效率的系统啊)
mov1
...被打断,另一线程执行fd=STDOUT_FILENO,或者len = 8(实际情况要复杂得多,大家都明白)
mov2

这和i=j;有区别吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP