双核双线程访问int变量,一个线程只读,另一个只写,要加锁么?

lifegamer 2008-10-02 03:53:43
如题?

问题要是太简单,当我白菜好了。

请指点一下。
...全文
668 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifegamer 2009-02-24
  • 打赏
  • 举报
回复
结论是要加锁。

原因是:没有理由不加!加了总是保险的,而锁的开销可以忽略不计。

呵呵~~谢谢。
呆萌-鱼 2008-10-06
  • 打赏
  • 举报
回复
是的,是根据开发人员的 需要来决定的。
你举的这个例子数据不同步造成的影响是比较小的, 因为线程读取的是中间状态的值的话,只有可能是前一个状态的值, 所以此线程顶多延迟一个执行序列后才退出。
像我们原来为了加快对数据的并行处理,对某些依赖的搜索数据的指针 没有用严格的锁来进行保护 , 而是判断此指针超出范围就退出处理,这样的情况也是有的。
denghui0815 2008-10-06
  • 打赏
  • 举报
回复
不一定 例如用一个全局BOOL 用来控制线程的退出 就不需要锁
呆萌-鱼 2008-10-06
  • 打赏
  • 举报
回复
原因在很多教科书中都有,这里简单描述一个例子:
线程WriteThread负责写变量int iShare
线程ReadThread负责读变量int iShare

因为iShare= 变量;不是一条源自指令, 通过反汇编可以看到至少有两条。
如果iShare参与某些表达式的运算,在赋值的话,就更复杂。
假设在WriteThread 对iShare运算的时候 中间状态为iShareTmp ,这个值可能等于iShare,也可能是别的值。

那么同时进行读的话,由于两个线程运行的时候时序无法确定, 如果不通过保护的话,ReadThread可能读出来的值
是iShareTmp,即和实际的WriteThread 对iShare运算出来的最终值不一样。

如果是这样的话, 程序运行产生的最终结果和你预期的结果不一样, 所以需要采用锁保护,或者同步量来进行同步。

采用锁,或者采用同步的根本目的 就是 排除线程运行时的时序不确定性,使程序运行能够得到稳定的人为可以预测的结果。
lifegamer 2008-10-04
  • 打赏
  • 举报
回复
我的天!
中文技术社区是不是太...那个...了点,算了!
唉!我还是去国外网站上去请教吧!
lifegamer 2008-10-03
  • 打赏
  • 举报
回复
why?

能不能用汇编指令简单解释一下为什么不可以呢?


如果是单核呢?是不是就能肯定不需要加锁保护了?
呆萌-鱼 2008-10-03
  • 打赏
  • 举报
回复
需要用来保护!
lifegamer 2008-10-02
  • 打赏
  • 举报
回复
我可以确定一个线程是只读的,另外一个是只写的。
但是没有办法确定读写操作发生的顺序。

就是想问一下,这种情况需不需要用锁来保护这个int变量,从而确保互斥访问呢?

还是说什么保护都不用,直接访问就行了?

这问题对高人应该很简单吧,不是黑就是白喽!

能不能有个明确点的说法呀?
cornmoon_blue 2008-10-02
  • 打赏
  • 举报
回复
要同步吧,确定你的程序对此变量的读写顺序,这样不用加锁,是顺序访问的。
如果两线程都有写操作,要加锁。

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧