gpt4 book ai didi

static - 静态变量是易变的吗?

转载 作者:行者123 更新时间:2023-11-29 08:00:29 26 4
gpt4 key购买 nike

我有这个 Rust 程序:

use std::{thread, time};

static mut c:bool = false;

fn main() {
unsafe {
// call some FFI program which sets up signals
c = false;
while !c {
thread::sleep(time::Duration::from_millis(10));
}
}
}

我将指向 c 的指针提供给一些 FFI 程序,该程序设置改变 c 的信号。我如何确定编译器不会消除 while 循环,因为它假定 c 永远不会改变?

C 有一个 volatile 关键字,告诉编译器不要在这些示例中进行优化。我怎样才能告诉 Rust 编译器同样的事情?

(我试图阅读 LLVM IR 代码,但无法弄清楚如何理解它)。

最佳答案

不,静态变量不是易变的。

Rust 中的正确解决方案是使用 AtomicBool .以下示例(来自 std::sync::atomic)与您想要执行的操作非常相似:

use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;

fn main() {
let spinlock = Arc::new(AtomicUsize::new(1));

let spinlock_clone = spinlock.clone();
let thread = thread::spawn(move|| {
spinlock_clone.store(0, Ordering::SeqCst);
});

// Wait for the other thread to release the lock
while spinlock.load(Ordering::SeqCst) != 0 {}

if let Err(panic) = thread.join() {
println!("Thread had an error: {:?}", panic);
}
}

您可以通过从信号处理程序到 Rust 的一些回调以这种方式完成。

还有不安全的函数std::ptr::read_volatilestd::ptr::write_volatile ,可用于直接访问内存。通常这些应该只用于访问硬件寄存器或用于实现安全抽象。

关于static - 静态变量是易变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41655118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com