原子操作的问题

发布于 2022-07-20 02:49:49 字数 532 浏览 10 评论 9

现在有一个全局的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

他不在意 2022-07-22 05:07:16

原帖由 mq110 于 2006-3-13 18:55 发表
仔细的看了一下asm/atomic.h 文件发现
#warning Using kernel header in userland program. BAD!

看来是不能用内核里的atomic_t类型的了。

可以自己实现atomic_t, 因为lock前缀和xchg、mfence等都不是特权指令

笔芯 2022-07-22 05:07:00

原帖由 luckmonkey 于 2006-3-13 16:50 发表
现在就是不想对其进行互斥操作,因为内存块可能有上百万个的
主要还是考虑到互斥的效率
查到两个函数
Interlockedincrement 与 InterlockedDecrement
这个似乎可以线程间安全的进行++或--操作
但不 ...

内存块可能有上百万个 与  互斥的效率 没有关系。
互斥 只与你的线程有关。
看来你还不懂什么叫互斥。

帥小哥 2022-07-22 05:06:57

原帖由 mq110 于 2006-3-13 17:58 发表
突然想 atomic_t类型是否可以在用户态使用.

呵呵。

总攻大人 2022-07-22 05:04:23

仔细的看了一下asm/atomic.h 文件发现
#warning Using kernel header in userland program. BAD!

看来是不能用内核里的atomic_t类型的了。

爱本泡沫多脆弱 2022-07-22 05:04:07

突然想 atomic_t类型是否可以在用户态使用.

青春如此纠结 2022-07-22 05:03:07

感谢2楼的版主
现在主要只是想对此变量进行++,——,以及非零判断
因此,觉得如果加互斥,是否有些不划算,会否影响效率
因为此变量很多

好的,我先代码测试一下
谢谢版主

旧伤还要旧人安 2022-07-22 03:35:22

互斥的效率怎么样得试过了才知道。
连一个解决方案都没有就谈效率无异于空中楼阁。
你可以先用 mutex 写一个,压力测试一下,再看效率够不够用。
做事要专业……

你说的那两个函数看都不用看就知道 linux/soliaris 上肯定不行的。

心的位置 2022-07-22 02:57:12

现在就是不想对其进行互斥操作,因为内存块可能有上百万个的
主要还是考虑到互斥的效率
查到两个函数
Interlockedincrement 与 InterlockedDecrement
这个似乎可以线程间安全的进行++或--操作
但不知在linux/soliaris上是否可行

多孤肩上扛 2022-07-20 10:50:27

会。
线程之间可以用 mutex 来互斥。
man pthread_mutex_init

  1. EXAMPLE
  2.        A shared global variable x can be protected by a mutex as follows:
  3.               int x;
  4.               pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
  5.        All accesses and modifications to x should be  bracketed  by  calls  to
  6.        pthread_mutex_lock and pthread_mutex_unlock as follows:
  7.               pthread_mutex_lock(&mut);
  8.               /* operate on x */
  9.               pthread_mutex_unlock(&mut);

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文