Mar*_*off 1 c c++ int128 thread-safety
我知道int128_tC和C++中存在一个类型.
如果我有两个线程,一个从包含这个128位整数的存储器位置读取,另一个正在写入它.
是否有可能将此值写为两个64位整数写入,还是一个128位整数写入?
C和C++都不需要具有int128_t类型,尽管如果编译器支持该类型,那么它必须是signed2的补码128位整数类型.但原子性不是必需的.
同时读取和写入任何非原子类型的行为是不确定的.
在C++中,如果你可以使用std::atomic<int128_t>和,如果你的平台确实有一个原子,int128_t那么这将只是一个typedef.
否则,在C中,您的编译器可能具有原子128位整数类型.如果没有,那么您可以使用内联汇编滚动自己的版本.
其他答案中讨论了支持.我将讨论实施问题.
通常,当从存储器读取时,编译器将发出处理器指令以将数据从存储器提取到寄存器中.这可能是原子的,这取决于在处理器和存储器之间如何设置数据总线.
如果您的处理器支持128位传输并且内存支持128位数据总线,则可以是单次提取(或写入).
如果您的处理器支持128位{寄存器}传输,但数据总线较小,则处理器将执行足够的提取以从内存传输数据.这可能是原子的,也可能不是原子的,这取决于你对原子的定义(它是一个处理器指令,但可能需要多次读取).
对于不支持128位寄存器传输的处理器,编译器将发出足够的指令将存储器读入寄存器.这用于寄存器到存储器或存储器以注册传输.
对于内存到内存传输(例如变量赋值),编译器可以选择使用块读取和写入(如果处理器支持块读取和写入).某些处理器支持SIMD,其他处理器可能具有块传输指令.例如,ARM具有LDM(加载多个)和STM(存储多个)指令,用于从存储器加载许多寄存器并将许多寄存器存储到存储器.块读取和写入的另一种方法是使用DMA设备(如果存在).DMA可以在处理器执行其他指令时传输数据.但是,使用DMA的开销可能需要比使用16个8字节(字节)传输更多的指令.
总之,编译器不需要支持int128_t.如果他们支持它,则有多种传输数据的方法,具体取决于处理器和平台硬件支持.查看汇编语言以查看编译器发出的支持指令int128_t.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |