Python有一个称为的线程对象Condition,它阻塞一个线程,直到另一个线程调用notifiy()或notify_all()在其上等待。wait()但是,在调用该方法之前,必须先调用acquire()以获取内部锁。wait()然后该方法释放锁并等待通知,此后它将继续重新获取锁,并且您可以运行一些需要线程安全的代码。我的问题是,为什么Condition调用该wait()方法时对象不只是在内部自动获取锁:
必须使用关联的锁来调用其他方法。该
wait()方法释放该锁,然后阻塞直到另一个线程通过调用notify()或唤醒它notify_all()。唤醒后,wait()重新获取锁并返回。也可以指定超时。
因此,在此代码中,我获取了锁,wait方法立即释放它,然后在通知它再次获取它之后,我最终释放了它。
lock = threading.Lock()
condition = threading.Condition(lock=lock)
...
condition.lock() # acquire the lock
condition.wait() # waiting for another thread to notify me
condition.release() # release the lock
Run Code Online (Sandbox Code Playgroud)
为什么wait()呼叫不只是等待,然后在收到通知后立即获取锁,所以我看不到为什么要获取然后释放的锁
我正在学习 Rust 参考,我想知道这个drop()功能。在此示例中是&Box<i32>对堆栈或堆上某些内容的引用。
let y = 32; // `y` lives on the stack
drop(y); // why doesn't this complain
println!("{}", y); // this also doesn't complain
Run Code Online (Sandbox Code Playgroud)