multithreading - raku 在具有不同参数的线程中调用相同的函数
问题描述
我记得在大学时代,线程共享资源和内存。我不知道 Raku 线程实现的细节,但是如果同时多个线程使用不同的参数调用同一个全局函数,它们是否会相互干扰,因为全局函数是一个由所有线程共享的单个代码块线程?例如,这个例子没有显示干扰,但是一些复杂的代码呢?
sub add ($a, $b) { $a + $b };
for 1..100 { start { sleep 1.rand; say "I am $_, {add($_, 1000)}"; } };
解决方案
你不必担心同时从多个线程访问一个全局函数,原则上:参数是按值传递的,参数是函数的词法。
我能想到一个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
但这只是炫耀,而不是直接回答您的问题:-)
如果您有一段代码要确保一次只执行一个线程,您可以使用 aLock
和上面的protect
方法;
my $lock = Lock.new; # usually in the mainline of a program
# ... code
$lock.protect: {
# code executed by only 1 thread at a time
}
请注意,这被认为是“管道”,也就是仅在需要时才使用它,因为它会使您陷入死锁。
推荐阅读
- json - 需要 AWS S3 QuickSight 清单文件 URI?
- events - CALL METHOD 和 -> 对于 ALV 事件的行为不同。为什么?
- authentication - SSO 移动应用到 Web 的最佳实践
- php - 一个类别的 WordPress 分页问题 - 分页修复
- php - 将压缩图像文件上传到 Moodle 服务器
- cmake - 使用安装/导出的 CMake 和版本配置文件
- eloquent - Eloquent leftJoin where 附加查询
- html - 在要显示的属性内添加换行符
模板角中的标签
- javascript - 有没有一种方法可以将依赖项对象与角度项目的 package.json 文件分开?
- python - 如何使用 if 语句检查用户是否具有权限或角色