- 主题:Int变量赋值是不是原子操作?
比如:
int a, b;
a = 1; //这个是原子操作吗?
b = a; //这个是原子操作吗?
有人说不是,因为赋值语句经常会分成几行汇编来执行;
有人说是,因为管你几行汇编执行,最终把1赋给a这个操作是一条指令,不能打断的,状态是明确的。
--
FROM 107.182.188.*
反正java里int赋值是原子的,long不是
【 在 wjhtingerx 的大作中提到: 】
: 比如:
: int a, b;
: a = 1; //这个是原子操作吗?
: ...................
--
FROM 61.170.163.*
不是
编译成机器代码 很多步骤
例如 内存分配 写入 变量符号表更新等
我们说的原子操作 是语言层面
不是机器指令 因为语言层面的语句 编译成多个机器指令 如果这些机器指令在同一个进程中不被打断执行便是原子的
打断便是非线程安全的
【 在 wjhtingerx 的大作中提到: 】
: 比如:
: int a, b;
: a = 1; //这个是原子操作吗?
: ...................
--
修改:nextworld8 FROM 219.142.236.*
FROM 219.142.236.*
对于应用编程来说
在语言层面 a=1 有可能被打断cpu时间片的
原子操作 针对语言层面的 不是物理执行层面
【 在 wjhtingerx 的大作中提到: 】
: 比如:
: int a, b;
: a = 1; //这个是原子操作吗?
: ...................
--
FROM 219.142.236.*
基本的一种场景:int有可能在硬件上是两个字,常量赋值也会按高低位被分成两个语句。
在某些硬件上,单条汇编语句也会分成两部完成,也不是原子的。
所以c++才加入了atomic标准库。
【 在 wjhtingerx 的大作中提到: 】
: 比如:
: int a, b;
: a = 1; //这个是原子操作吗?
: ...................
--
修改:milksea FROM 114.249.226.*
FROM 114.249.226.*
如果排除这种硬件呢?比如32位机器,32位int,最终赋值只能一个语句吧
【 在 milksea 的大作中提到: 】
: 基本的一种场景:int有可能在硬件上是两个字,常量赋值也会按高低位被分成两个语句。
: 在某些硬件上,单条汇编语句也会分成两部完成,也不是原子的。
: 所以c++才加入了atomic标准库。
--
FROM 107.182.188.*
c11 可以在 int 前加 _Atomic 修饰
_Atomic uint32_t value = 0;
这样赋值就是原子操作了
【 在 wjhtingerx 的大作中提到: 】
: 比如:
: int a, b;
: a = 1; //这个是原子操作吗?
: ...................
--
FROM 123.125.204.*
那就是对着汇编查cpu手册了。反正c/c++不保证。
前面说了一条cpu汇编语句也未必是原子的,armv7就是这样。
【 在 wjhtingerx 的大作中提到: 】
: 如果排除这种硬件呢?比如32位机器,32位int,最终赋值只能一个语句吧
:
:
: ...................
--
修改:milksea FROM 114.254.9.*
FROM 114.254.9.*
再研究这个没什么现实意义。你要写并发程序,那就直接用atomic库提供的接口,c或者c++都有,库不全哪怕内嵌汇编呢,反正是没有硬写c代码然后指望它正好没出错的道理。
【 在 wjhtingerx 的大作中提到: 】
: 如果排除这种硬件呢?比如32位机器,32位int,最终赋值只能一个语句吧
:
:
: ...................
--
FROM 114.254.9.*
这个取决于硬件,有的是原子操作,有的不是。
所以才需要在软件中定义memory model和相关的原语来抽象和隔离硬件差异。
--
FROM 123.119.160.*