我想知道的是lock xchg,mfence从一个线程访问内存位置的角度来看是否会有类似的行为,这个内存位置正在被其他线程进行变异(让我们随便说).它能保证我获得最新的价值吗?之后的内存读/写指令?
我混淆的原因是:
8.2.2"读取或写入不能通过I/O指令,锁定指令或序列化指令重新排序."
-Intel 64 Developers Manual Vol.3
这是否适用于线程?
mfence 状态:
对MFENCE指令之前发出的所有内存加载和存储到内存指令执行序列化操作.此序列化操作保证在MFENCE指令之前的任何加载或存储指令全局可见之前,在程序顺序之前的每条加载和存储指令都是全局可见的.MFENCE指令针对所有加载和存储指令,其他MFENCE指令,任何SFENCE和LFENCE指令以及任何序列化指令(例如CPUID指令)进行排序.
-Intel 64 Developers Manual Vol 3A
这听起来更有力.因为它听起来mfence几乎正在刷写写缓冲区,或者至少延伸到写缓冲区和其他内核以确保我未来的加载/存储是最新的.
当基准标记时,两个指令都需要约100个循环才能完成.所以我无论如何都看不出那么大的差异.
主要是我只是困惑.我的指令基于lock互斥体使用,但后来这些包含没有内存栅栏.然后,我看到锁免费使用内存栅栏编程,但没有锁.我知道AMD64有一个非常强大的内存模型,但过时的值可以在缓存中持续存在.如果lock行为与行为不同,mfence那么互斥量如何帮助您查看最新值?
x86 assembly multithreading cpu-architecture memory-barriers
该cargo命令行工具可以让我为我的箱子生成文档,但我有结构如:
#[cfg(target-platform("windows")]
mod winstuff {
/// Explanation of Windows-specific tasks
}
#[cfg(target-platfrom("linux")]
mod linstuff {
/// Explanation of Linux-specific tasks
}
Run Code Online (Sandbox Code Playgroud)
当我运行时cargo docs --no-deps,只生成我正在生成文档的特定于平台的模块.如何为所有平台生成文档?
我的默认 Rust 启用了整数溢出保护,并且会在溢出时停止正在执行的程序。大量算法需要溢出才能正常运行(SHA1、SHA2 等)
我似乎无法在官方文档中挖掘任何内容。我可以看到有多种旧方法可以做到这一点(int::parse_bytes和f32::from_string),但这两种方法都已弃用。在 1.0 中执行此操作的方式是什么?
while(variable & 0x08)
Run Code Online (Sandbox Code Playgroud)
我在do while循环中发现了这个问题,所讨论的变量在技术上是16位int数组中的第4个索引.while循环本身不会修改该数组.
老实说,我不确定语法是做什么的.
我目前在java中有一个奇怪的功能,我试图规避.如果我将一个字节定义为0x80并且我向右移位1位置,则java将输出0xC0,而不是0x40.有人知道为什么吗?
此外,如果我输入0x70,并向右移1位置,它将正确输出0x38.
我也注意到这种行为也是短路和冲击.当MSB被设置时,MSB将无论如何都保持设置,并且当该值被转换为更大的值(ala int)时,"新"空间将被设置位填充.
基本上我要问的是这种行为是否正确?
如何在不在内存中移动它的情况下为向量的基础堆分配分配生命周期?
我发现这是最简单的方法
pub fn heap_slice<'a, T:'a>(x: Vec<T>) -> &'a [T] {
use std::mem::forget;
use std::slice::from_raw_parts;
x.shrink_to_fit();
let ptr = x.ptr();
let len = x.len();
forget(x);
unsafe{ from_raw_parts(ptr,len) };
}
Run Code Online (Sandbox Code Playgroud)
但这确实unsafe在stdlib之外调用,这通常是不受欢迎的.有安全的方法吗?
我看到的into_boxed_slice是大致相同的事情.但是,&[T]一旦它是一个,我该如何恢复并分配它Box<[T]>?