社区
英特尔边缘计算技术
帖子详情
双核双线程访问int变量,一个线程只读,另一个只写,要加锁么?
lifegamer
2008-10-02 03:53:43
如题?
问题要是太简单,当我白菜好了。
请指点一下。
...全文
668
9
打赏
收藏
双核双线程访问int变量,一个线程只读,另一个只写,要加锁么?
如题? 问题要是太简单,当我白菜好了。 请指点一下。
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
要同步吧,确定你的程序对此变量的读写顺序,这样不用加锁,是顺序访问的。
如果两线程都有写操作,要加锁。
线程
安全问题
三、
线程
安全(重点) 对于多个
线程
,操作同
一个
共享数据(堆里边的对象,方法区中的数据,如静态
变量
) 如果都是读操作:没有赋值操作,只是获取值——没有安全问题 如果
一个
读,
一个
写
多个
写
(至少
一个
线程
写
操作,就会存在
线程
安全问题) 产生
线程
安全的原因: 原子性: 表示一组操作(可能是一行或多行代码),是不可拆分的最小执行单位,就表示这组操作是原子性的 某个
线程
对共享
变量
的多次操作,中间存在并发并行执行其他
线程
的对同
一个
共享
变量
的操作,就不具有原子性 例子1: 例子2: public class
java多
线程
操作中
线程
冲突问题
当多个
线程
同时运行时,
线程
的调度由操作系统决定,程序本身无法决定。因此,任何
一个
线程
都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。 这个时候,有个单
线程
模型下不存在的问题就来了:如果多个
线程
同时读
写
共享
变量
,会出现数据不一致的问题。如下所示: ···jav ··· ...
c++11并发与多
线程
视频连接 并发 早期计算机是单核cpu,只能同时执行
一个
任务,所以就快速切换任务主体,实现“同时”做多个任务,造成
一个
并发的假象; 后来多核cpu的计算机出现了,可以实现真正的并行任务执行;即支持硬件并发; 使用并发主要是为了挺高性能
线程
和进程 每
一个
可执行程序就对应
一个
进程; 每
一个
进程里只能包含
一个
主
线程
,并且这个主
线程
随着可执行程序的启动而启动; 比如c的main函数就是
一个
主
线程
,程序启动时,先启动main部分 并行的实现方式 可以使用多进程实现并行,或者多
线程
实现并行。 进程之间:在同一电脑上使
Linux多
线程
实现文件读
写
操作—copy
Linux使用多
线程
实现文件的复制——copy,对文件进行读取,
写
入操作!
3
线程
与
线程
切换
实现
线程
的创建与切换,了解RTT内核
英特尔边缘计算技术
567
社区成员
7,024
社区内容
发帖
与我相关
我的任务
英特尔边缘计算技术
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
复制链接
扫一扫
分享
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章