首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

使用线程锁就可以保证书不出现要同时往某一地址送两指令//就不需要使用volatile关键字了吧

2013-09-15 
使用线程锁就可以保证不出现要同时往某一地址送两指令//就不需要使用volatile关键字了吧?比如要往某一地址

使用线程锁就可以保证不出现要同时往某一地址送两指令//就不需要使用volatile关键字了吧?
比如要往某一地址送两指令: 
int *ip =...; //设备地址 
*ip = 1; //第一个指令 
*ip = 2; //第二个指令 

[解决办法]
int *ip =...; //设备地址 
*ip = 1; //第一个指令 
*ip = 2; //第二个指令 

没有后续的代码使用 *ip

这种代码,恰恰就属于无用代码,符合废码消除优化的条件,

加锁,是限制,同时操作同一数据的,和保证线程,按照某种顺序执行的,不能避免废码消除优化.
废码消除优化,会彻底消除这段代码,结果是,完全不生成代码.

加锁,是运行时行为,
编译器优化,是编译时行为,

所以这是两种完全无关,的行为.
并且是互不妨碍的.



1)读写同时操作,可能会读到脏数据(一部分数据读之前就写了,一部分数据,读后才写,这样两次读到的,是不同批次写的数据比如有一个数据 128Bits,读一半,就写了,写的稍快一点,比如原数据 
55 55 55 55 -55  55 55 55 -55 55 55 55- 55 55 55 55
这次全部改成AA 
已经读出55 55 55 55 -55  55 55 55
后面的全部改成  AA 
55 55 55 55 -55  55 55 55 -55 55 55 55- 55 55 55 55
那么有可能
读到的数据是55 55 55 55 -55  55 55 55 -55 55 AA AA- AA AA AA AA
 )
读到的根本就不是写入的数据

2)同时写,可能数据各写一部分,造成写数据出错.

3)有些时候,必须按照某种顺序,操作,才是正确的,这时候必须进行同步,才能够保证事情,按照正确的顺序进行.
不然,多线程虽好,却是非常不靠谱的.

热点排行