开始我们的Semaphore项目,我给了我的学生一个糟糕的p()方法版本:
proc p() {
while (this.tokens <= 0) {
sleep(1);
writeln("Tokens: ", this.tokens);
}
this.tokens -= 1;
}
Run Code Online (Sandbox Code Playgroud)
我给它们一些额外的代码来测试它,它增加了另一个线程中的令牌数量(使用v()方法).您可以看到令牌数量增加(大于0)但代码不会退出while循环.
一时兴起,我添加了一个任务声明:
proc p() {
while (this.tokens <= 0) {
this.tokens = this.tokens;
sleep(1);
writeln("Tokens: ", this.tokens);
}
this.tokens -= 1;
}
Run Code Online (Sandbox Code Playgroud)
这解决了测试运行中的问题(尽管它的线程安全性更低).为什么原始的while循环卡住了,为什么添加这个赋值可以解决它?
chapel ×1