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

标签 multithreading function parameters raku

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

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

最佳答案

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

我能想到一个异常(exception):使用 state在这样的函数中的变量。在初始化状态变量时存在已知的竞争条件,更新形式为 $foo++。同时从多个线程运行时很可能会错过增量。例如。:

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

又名,不是 1000000你会期待的。幸运的是,为了处理这种情况,我们有原子整数:
my atomicint $a;
await (^10).map: { start { $a⚛++ for ^100000 } }
say $a;  # 1000000

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

如果您有一段代码要确保一次只执行一个线程,您可以使用 Lockprotect方法;
my $lock = Lock.new;  # usually in the mainline of a program
# ... code
$lock.protect: {
    # code executed by only 1 thread at a time
}

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

关于multithreading - raku 在具有不同参数的线程中调用相同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61423137/

相关文章:

java Callable FutureTask Excecuter : How to listen to finished task

c++ - 如何使用来自另一个函数的字符串?

MySQL 简单函数不适用于变量声明

parameters - Latex Tikz/Pgf 声明带有参数的形状和带有数字的 anchor

parameters - 我可以根据 Informatica PowerCenter 中存储过程的输出设置参数吗?

linux - 在 @INC 中找不到 File/Find/Rule.pm

java - 无法在线程内创建处理程序。如何使用 Looper.prepare()?

java - 提高非重复并发 ArrayList 的性能

c - 关于指针和结构体的代码中的问题

c++ - 将运算符作为参数传递