Multithreading 如何确保一段代码在任何给定时间总是由一个线程使用?
我正在编写一个需要使用可变静态变量才能工作的函数(一个奇怪的消息循环实现)。为了在任何给定的时间只允许一个编写器访问这些变量,我需要将对该函数的访问设为独占(对访问它的第一个线程) 使用 我的第一个猜测是使用:Multithreading 如何确保一段代码在任何给定时间总是由一个线程使用?,multithreading,rust,atomic,Multithreading,Rust,Atomic,我正在编写一个需要使用可变静态变量才能工作的函数(一个奇怪的消息循环实现)。为了在任何给定的时间只允许一个编写器访问这些变量,我需要将对该函数的访问设为独占(对访问它的第一个线程) 使用 我的第一个猜测是使用: 使用std::sync::atomic::{Ordering,AtomicBool}; 静态标志:AtomicBool=AtomicBool::new(false); fn my_exclusive_函数(){ if标志加载(顺序::SeqCst){ 惊慌失措!(“哈哈,太晚了!”) }
使用std::sync::atomic::{Ordering,AtomicBool};
静态标志:AtomicBool=AtomicBool::new(false);
fn my_exclusive_函数(){
if标志加载(顺序::SeqCst){
惊慌失措!(“哈哈,太晚了!”)
}
FLAG.store(true,Ordering::SeqCst);
/*做事*/
}
此代码有一个明显的缺陷:如果两个线程碰巧同时读取标志
,它们都会认为这样可以继续
使用
然后我想用一个锁来锁
使用std::sync::Mutex;
静态标志:Mutex=Mutex::new(());
fn my_exclusive_函数(){
让_lock=FLAG.try_lock(){
Ok(锁定)=>锁定,
呃()=>恐慌!(“哈哈,太晚了!”),
};
/*做事*/
//`u lock`在这里被删除,另一个线程现在可以访问该函数了
}
这里有两个问题:
- 答案特别集中在C#和.NET上,并且涉及到我在Rust中没有的特性
Ordering::Relaxed
是否足够?我对异步编程相当陌生。(a)那不是异步编程。(b) 我一直无法理解顺序。我使用SeqCst
,所以我不必思考。我的书签是/@Shepmaster,对我来说似乎很神奇(x)订购如何?对于这种情况,Ordering::Relaxed
是否足够?我对异步编程相当陌生。(a)那不是异步编程。(b) 我一直无法理解顺序。我使用SeqCst
,所以我不必思考。我的书签是