看似简单的问题:一个线程对int写,另一个线程对该int读,是否安全? 一个线程对UINT64 val,作val++操作,另一个线程读取val,是否有可能读取到“脏数据”? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有可能,val++不是一个原子操作 上面说的对,用原子操作就不会了。val=InterlockedIncrement64(val); 大家回答的太简单,我知道val++不是原子操作。但并不一定影响读取的值。谁能从汇编的角度分析一下啊!! 我说个情形:一个固定的线程执行; 现假设: val=1, 执行val++操作,一半时停止。另一个线程执行: UINT64 n = val; 只要n为1或2,就不算脏数据。 n的值有没有可能为1,2以外的其它值哪?请高手详细分析一下? 如果是多核或超线程cpu,有可能多个线程同时运行,就不存在线程切换。这种情况下还安全吗? 应该是这样的:在32位系统中读写INT或UINT是安全的。而UINT64在32位系统中读写需要执行2次汇编指令,如果在指令执行中进行线程切换,你就会读到脏数据。val++32位系统中是:1.读val低位到ECX2.读val高位到EDX3.执行INC指令4.回写val低位5.回写val高位 竖直显示文本问题? VC++ 如何判断程序打开的方式。 HOOK CreateFile导致explorer崩溃的问题 关于CString类的问题 高手快来救命!关于FAT32文件系统根目录的问题 一个小问题 一道面试题 如何使用mfc类库写程序自动发帖子 win7和xp下同一个vs2010重建三维图像项目,xp能显示win7不能 bcgcontrolbar如何弄中文向导,让对话框也显示中文(原始的是乱码) 如何在VC7中使用ASSERT 散分,祝大家C币多多
val=InterlockedIncrement64(val);
一个固定的线程执行;
现假设: val=1, 执行val++操作,一半时停止。
另一个线程执行:
UINT64 n = val; 只要n为1或2,就不算脏数据。 n的值有没有可能为1,2以外的其它值哪?
请高手详细分析一下?
在32位系统中读写INT或UINT是安全的。
而UINT64在32位系统中读写需要执行2次汇编指令,如果在指令执行中进行线程切换,你就会读到脏数据。val++
32位系统中是:
1.读val低位到ECX
2.读val高位到EDX
3.执行INC指令
4.回写val低位
5.回写val高位