首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 是否可以不用锁? [已结贴,结贴人:gel_ink]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 11:19:26 楼主
    int num 只在一个线程中被赋值(修改)
    在另外一个的线程中读取它的值. int k = num;

    这种情况不需要用锁?
    在64位cpu上呢?

    如果换成 char num,  WORD num, 是否可以不用锁?

    希望有intel方面的官方文档说明.
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 11:45:081楼 得分:0
    还要单核,多核的情况?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 12:58:592楼 得分:100
    读后写, 和写后读的结果一样么?  如果会出现不一样, 当然要保护了, 典型的竞争冲突(Race Condition)啊...

    这个和你的硬件系统有几个CPU, CPU有几个核, 没有任何关系

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 16:15:543楼 得分:0
    引用 2 楼 intel_iclifort 的回复:
    读后写, 和写后读的结果一样么?  如果会出现不一样, 当然要保护了, 典型的竞争冲突(Race Condition)啊...

    这个和你的硬件系统有几个CPU, CPU有几个核, 没有任何关系


    读后写? 写后读?
    写后再读的结果肯定不同了,这有关系吗? 即使加锁保护后,结果也不同啊.
    它的竞争在哪里?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 16:58:594楼 得分:0
    我希望:
    写值时,它可以成功完成,不会写错. 修改的一瞬间,应该是原子操作吧?
    读值时,结果要么是写前的数值,要么是写后的数值,不会是其他的什么值.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:22:485楼 得分:0
    引用 3 楼 gel_ink 的回复:
    引用 2 楼 intel_iclifort 的回复:
    读后写, 和写后读的结果一样么?  如果会出现不一样, 当然要保护了, 典型的竞争冲突(Race Condition)啊...

    这个和你的硬件系统有几个CPU, CPU有几个核, 没有任何关系


    读后写? 写后读?
    写后再读的结果肯定不同了,这有关系吗? 即使加锁保护后,结果也不同啊.
    它的竞争在哪里?


    竞争冲突, 是指这一类由于执行顺序不同, 可能会引起结果不正确的情况, 包括读后写, 写后读, 和写后写

    你例子中的情况, 关键是读num后, 还有没有其它相关代码的运行结果, 会受到影响.  需要根据代码来具体分析

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:30:526楼 得分:0
    能否举个结果受影响的例子?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:32:437楼 得分:0
    引用 4 楼 gel_ink 的回复:
    我希望:
    写值时,它可以成功完成,不会写错. 修改的一瞬间,应该是原子操作吧?
    读值时,结果要么是写前的数值,要么是写后的数值,不会是其他的什么值.


    高级语言中, 能够转化为原子操作的非常有限, 受到不同硬件平台实现的限制.  举个例子, 累加在Windows里提供了相应的API, 在Linux里就没有
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:47:348楼 得分:0
    引用 7 楼 intel_iclifort 的回复:

    高级语言中, 能够转化为原子操作的非常有限, 受到不同硬件平台实现的限制.  举个例子, 累加在Windows里提供了相应的API, 在Linux里就没有



    我的情况是 c++语言(vc2005), 写操作就是 num = m;

    你说的Windows里提供了的累加API,指InterlockedIncrement()吧,
    我的愿望是,虽然InterlockedIncrement()够快,
    但它毕竟用了"memory barrier",而且还有函数的栈操作消耗,
    所以最好也不用InterlockedXxx()函数. 做到分秒必争.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:47:369楼 得分:0
    引用 7 楼 intel_iclifort 的回复:

    高级语言中, 能够转化为原子操作的非常有限, 受到不同硬件平台实现的限制.  举个例子, 累加在Windows里提供了相应的API, 在Linux里就没有



    我的情况是 c++语言(vc2005), 写操作就是 num = m;

    你说的Windows里提供了的累加API,指InterlockedIncrement()吧,
    我的愿望是,虽然InterlockedIncrement()够快,
    但它毕竟用了"memory barrier",而且还有函数的栈操作消耗,
    所以最好也不用InterlockedXxx()函数. 做到分秒必争.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 17:47:4010楼 得分:0
    引用 7 楼 intel_iclifort 的回复:

    高级语言中, 能够转化为原子操作的非常有限, 受到不同硬件平台实现的限制.  举个例子, 累加在Windows里提供了相应的API, 在Linux里就没有



    我的情况是 c++语言(vc2005), 写操作就是 num = m;

    你说的Windows里提供了的累加API,指InterlockedIncrement()吧,
    我的愿望是,虽然InterlockedIncrement()够快,
    但它毕竟用了"memory barrier",而且还有函数的栈操作消耗,
    所以最好也不用InterlockedXxx()函数. 做到分秒必争.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 18:01:4511楼 得分:0

    Atomic increment/decrement operations on 32/64 bit integer variables: http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/980382.aspx

    64-bit atomic operations.:  http://www.exit.com/blog/archives/000361.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 18:04:1812楼 得分:0
    引用 7 楼 intel_iclifort 的回复:

    高级语言中, 能够转化为原子操作的非常有限, 受到不同硬件平台实现的限制.  举个例子, 累加在Windows里提供了相应的API, 在Linux里就没有



    我的情况是 c++语言(vc2005), 写操作就是 num = m;

    你说的Windows里提供了的累加API,指InterlockedIncrement()吧,
    我的愿望是,虽然InterlockedIncrement()够快,
    但它毕竟用了"memory barrier",而且还有函数的栈操作消耗,
    所以最好不用InterlockedXxx()函数. 做到分秒必争.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 18:13:1213楼 得分:0
    csdn犯毛病了,点了很多次"提交"看不到结果,等看到结果时,出现了一堆. -- 题外话


    我看了你给的英文链接,看得不是太懂,
    大意好象是:
    如果 num是按照 32-byte cache line 对齐(alignment)的, 就可以保证它是原子操作?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 18:19:1014楼 得分:0
    Lexi S.(Intel(R) Software Network Support):
    Here, it is guaranteed that simple loads or stores will be automatically atomic as long as the memory location is aligned on the appropriate boundary (16-bit boundary for 16-bit values, 32-bit boundary for 32-bit values, and so forth).


    看起来好象是不需要同步锁了?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved