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中没有的特性

    /@Shepmaster对我来说似乎很神奇(x)订购如何?对于这种情况,
    Ordering::Relaxed
    是否足够?我对异步编程相当陌生。(a)那不是异步编程。(b) 我一直无法理解顺序。我使用
    SeqCst
    ,所以我不必思考。我的书签是/@Shepmaster,对我来说似乎很神奇(x)订购如何?对于这种情况,
    Ordering::Relaxed
    是否足够?我对异步编程相当陌生。(a)那不是异步编程。(b) 我一直无法理解顺序。我使用
    SeqCst
    ,所以我不必思考。我的书签是