原子操作的问题
现在有一个全局的count值
我必须判断其,然后对内存进行操作
现在有个问题就是线程间切换的问题
是否会出现,A线程在改变count值时,B线程切换上去,随后更改了count值,进行了内存释放
然后切换回A线程,继续执行count值与内存释放,但此时count和内存已经被释放了;
我将判断语句写为if(!--count)
将其转换为汇编后,是3条语句;
mov eax, DWORD PTR _x$[ebp];X的值载入寄存器
sub eax, 1 ;+1
mov DWORD PTR _x$[ebp], eax;x的值写入寄存器
请问是否回中间打断切换
就是在值载入寄存器,还未运算,并写如寄存器时,会否切换出去
如果一个--操作都要进行互斥的话,对系统间的要求就太高了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
可以自己实现atomic_t, 因为lock前缀和xchg、mfence等都不是特权指令
内存块可能有上百万个 与 互斥的效率 没有关系。
互斥 只与你的线程有关。
看来你还不懂什么叫互斥。
呵呵。
仔细的看了一下asm/atomic.h 文件发现
#warning Using kernel header in userland program. BAD!
看来是不能用内核里的atomic_t类型的了。
突然想 atomic_t类型是否可以在用户态使用.
感谢2楼的版主
现在主要只是想对此变量进行++,——,以及非零判断
因此,觉得如果加互斥,是否有些不划算,会否影响效率
因为此变量很多
好的,我先代码测试一下
谢谢版主
互斥的效率怎么样得试过了才知道。
连一个解决方案都没有就谈效率无异于空中楼阁。
你可以先用 mutex 写一个,压力测试一下,再看效率够不够用。
做事要专业……
你说的那两个函数看都不用看就知道 linux/soliaris 上肯定不行的。
现在就是不想对其进行互斥操作,因为内存块可能有上百万个的
主要还是考虑到互斥的效率
查到两个函数
Interlockedincrement 与 InterlockedDecrement
这个似乎可以线程间安全的进行++或--操作
但不知在linux/soliaris上是否可行
会。
线程之间可以用 mutex 来互斥。
man pthread_mutex_init
复制代码