在 Lock::Async 中§
请参阅主要文档 在上下文中 以了解方法 lock
method lock(Lock::Async: --> Promise)
返回一个 Promise
,当锁可用时将保留该锁。如果锁已经可用,则将返回一个已经保留的 Promise
。使用 await
以非阻塞方式等待锁可用。
my = Lock::Async.new;await .lock;
最好使用 protect 而不是显式调用 lock
和 unlock
。
在 Lock 中§
请参阅主要文档 在上下文中 以了解方法 lock
method lock(Lock:)
获取锁。如果当前不可用,则等待它。
my = Lock.new;.lock;
由于 Lock
是使用操作系统提供的工具实现的,因此等待锁的线程在锁可用之前不会被调度。由于 Lock
是可重入的,因此如果当前线程已经持有锁,则调用 lock
将简单地增加递归计数。
虽然使用 lock
方法很容易,但正确使用 unlock
却比较困难。相反,最好使用 protect
方法,该方法负责确保 lock
/unlock
调用始终同时发生。
在 IO::CatHandle 中§
请参阅主要文档 在上下文中 以了解方法 lock
method lock(IO::CatHandle: Bool : = False, Bool : = False --> True)
与 IO::Handle.lock
相同。如果 源句柄队列已用尽,则返回 Nil
。
仅锁定当前活动源句柄。 .on-switch
Callable
可用于在 CatHandle 处理它们时方便地锁定/解锁句柄。
在 IO::Handle 中§
请参阅主要文档 在上下文中 以了解方法 lock
method lock(IO::Handle:Bool : = False, Bool : = False--> True)
对已打开的文件句柄放置一个建议锁。如果 :$non-blocking
为 True
,则在无法获取锁时将 失败
,并显示 X::IO::Lock
,否则将阻塞,直到可以放置锁。如果 :$shared
为 True
,则将放置一个共享(读取)锁,否则将放置一个独占(写入)锁。如果成功,则返回 True
;如果无法放置锁(例如,当尝试对以写入模式打开的文件句柄放置共享锁或尝试对以读取模式打开的文件句柄放置独占锁时),则将 失败,并显示 X::IO::Lock
。
您可以再次使用 .lock
来用另一个锁替换现有锁。要移除锁,请 关闭
文件句柄或使用 unlock
。
# One program writes, the other reads, and thanks to locks either# will wait for the other to finish before proceeding to read/write# Writergiven "foo".IO.open(:w)# Readergiven "foo".IO.open