raku 在具有不同参数的线程中调用相同的函数

lis*_*tor 4 parameters multithreading function raku

我记得在大学时代,线程共享资源和内存。我不知道线程的 Raku 实现的细节,但是如果同时多个线程使用不同的参数调用同一个全局函数,它们会不会相互干扰,因为全局函数是所有线程共享的单个代码块线程?例如,这个例子没有显示干扰,但是一些复杂的代码呢?

sub add ($a, $b) { $a + $b };
for 1..100 { start { sleep 1.rand; say "I am $_, {add($_, 1000)}"; } };
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 5

您不必担心同时从多个线程访问全局函数,原则上:参数按值传递,参数是函数的词法。

一个例外,我能想到的:使用state这样的函数内部变量。状态变量的初始化存在已知的竞争条件,$foo++当同时从多个线程运行时,表单的更新很可能会错过增量。例如:

my int $a;
await (^10).map: { start { $a++ for ^100000 } }
say $a;  # 893127
Run Code Online (Sandbox Code Playgroud)

Aka,不是1000000你所期望的。幸运的是,为了处理这种情况,我们有原子整数:

my atomicint $a;
await (^10).map: { start { $a?++ for ^100000 } }
say $a;  # 1000000
Run Code Online (Sandbox Code Playgroud)

但这只是炫耀,而不是直接回答您的问题:-)

如果你有一段代码想要确保一次只执行一个线程,你可以使用 aLockprotect方法;

my $lock = Lock.new;  # usually in the mainline of a program
# ... code
$lock.protect: {
    # code executed by only 1 thread at a time
}
Run Code Online (Sandbox Code Playgroud)

请注意,这被认为是“管道”,也就是仅在您需要时才使用它,因为它会使您陷入僵局。

  • 模块“OO:Monitors”还可以帮助保证一次只有一个线程运行对象的方法。 (2认同)