在 Lock::Async 中§

请参阅主要文档 在上下文中 以了解方法 lock

method lock(Lock::Async:D: --> Promise:D)

返回一个 Promise,当锁可用时将保留该锁。如果锁已经可用,则将返回一个已经保留的 Promise。使用 await 以非阻塞方式等待锁可用。

my $l = Lock::Async.new;
await $l.lock;

最好使用 protect 而不是显式调用 lockunlock

在 Lock 中§

请参阅主要文档 在上下文中 以了解方法 lock

method lock(Lock:D:)

获取锁。如果当前不可用,则等待它。

my $l = Lock.new;
$l.lock;

由于 Lock 是使用操作系统提供的工具实现的,因此等待锁的线程在锁可用之前不会被调度。由于 Lock 是可重入的,因此如果当前线程已经持有锁,则调用 lock 将简单地增加递归计数。

虽然使用 lock 方法很容易,但正确使用 unlock 却比较困难。相反,最好使用 protect 方法,该方法负责确保 lock/unlock 调用始终同时发生。

在 IO::CatHandle 中§

请参阅主要文档 在上下文中 以了解方法 lock

method lock(IO::CatHandle:D: Bool:D :$non-blocking = FalseBool:D :$shared = False --> True)

IO::Handle.lock 相同。如果 源句柄队列已用尽,则返回 Nil

仅锁定当前活动源句柄。 .on-switch Callable 可用于在 CatHandle 处理它们时方便地锁定/解锁句柄。

在 IO::Handle 中§

请参阅主要文档 在上下文中 以了解方法 lock

method lock(IO::Handle:D:
            Bool:D :$non-blocking = FalseBool:D :$shared = False
            --> True)

对已打开的文件句柄放置一个建议锁。如果 :$non-blockingTrue,则在无法获取锁时将 失败,并显示 X::IO::Lock,否则将阻塞,直到可以放置锁。如果 :$sharedTrue,则将放置一个共享(读取)锁,否则将放置一个独占(写入)锁。如果成功,则返回 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 
 
# Writer 
given "foo".IO.open(:w{
    .lock;
    .spurt: "I ♥ Raku!";
    .close# closing the handle unlocks it; we could also use `unlock` for that 
}
 
# Reader 
given "foo".IO.open {
    .lock: :shared;
    .slurp.say# OUTPUT: «I ♥ Raku!␤» 
    .close;
}