【发布时间】:2021-05-07 18:57:52
【问题描述】:
我一直在 Nim 中使用threadpool,并且遇到了spawned 函数不能接受可变参数的要求。但是,我想根据acquire 的类型传递一个proc 一个Lock,而它又必须 是可变的。我发现解决这个问题的唯一方法是让锁可变并在全局范围内声明,所以我不必将它传递给函数 I spawn。
但我真的宁愿避免这种情况。我有使用指针的想法——所以锁可以是可变的,但指针本身不是——来解决这个问题,但看起来指针在 Nim 中并不是真正的一流对象。我尝试将waitLock 的参数声明为ref(第3 行),但我仍然抱怨acquire 必须在这里传递var Lock 而不是ref Lock。而且看起来取消引用指针也是自动完成的,所以没有办法解决它......?有什么办法可以绕过使用动态范围并将锁显式传递给proc?我不能做我想做的事有充分的理由吗?还是我只是错过了某些手册中的取消引用运算符?最干净的实现方式是什么?
import os, threadpool, locks
proc waitLock(lock: ref Lock): void =
acquire lock
echo "Child thread has lock!"
release lock
var lock: Lock
initLock lock
spawn waitLock(lock)
acquire lock
echo "Parent thread has lock!"
release lock
sync()
deinitLock lock
【问题讨论】:
-
全局锁有什么问题?
标签: multithreading mutex nim-lang