我目前正在学习关键部分和信号量,我被这部分卡住了。希望大家能给我一个见解。
我有这 3 种类型的线程:一种会在堆栈上执行 pop(),另一种会在同一堆栈上执行 push(),最后一个会打印该堆栈的值。目前,我已经将 wait() 和 signal() 放在了我认为是关键部分的地方。
class Example{
public static void main(){
//create thread objects
StackPop p1 = new StackPop();
StackPop p2 = new StackPop();
StackPop p3 = new StackPop();
StackPush ps1 = new StackPush();
StackPush ps2 = new StackPush();
StackPush ps3 = new StackPush();
StackValues s1 = new StackValues();
StackValues s2 = new StackValues();
StackValues s3 = new StackValues();
//then we start these threads in mix orders
p1.start();
s3.start();
ps2.start();
// etc
}
}
class StackPop extends Thread{
public void run(){
mutex.wait();
pop();
SOP("value popped is " + get.popVal);
mutex.signal();
}
}
class StackPush extends Thread{
public void run(){
mutex.wait();
push();
SOP("value inserted is " + get.pushVal);
mutex.signal();
}
}
class StackValues extends Thread{
public void run(){
mutex.wait();
for(int i = 0; i<stack.size(); i++)
S.O.P.("["+getVal(i)+"]"); //where getVal() will retrieve value at that index
mutex.signal();
}
}
上面的代码是一个简化版,但是思路是一样的。我的问题是即使我使用了 wait() 和 signal(),我仍然得到一个非常奇怪的输出。例如,我的部分输出将显示“插入的 [1][2][3] 值是 3 [5][@][@]”(其中 @ 表示内部没有数字)。我意识到这是因为处理器在 for 循环获取值时让另一个线程运行。我假设 wait() 和 signal() 会自动使其成为原子,但也许我错过了一些东西。