所以我不确定问题出在哪里,我觉得这是一个基本的锁定设置。每个线程都试图获取锁定,而另一个线程可以通过临界区,而另一个线程必须等到线程释放锁定。
但奇怪的是,我的数字左边'对于线程来说有时是相同的。
例如,它应该是:
class SoccerBall extends Ball{
public SoccerBall(int size){
super(size);
}
@Override
public void setSize(int size){
super.setSize(size);
}
@Override
public int getSize(){
return super.getSize();
}
}
或类似的东西一直到0但我倾向于:
Thread 1 - 16 - Thread 2 - 16
Thread 1 - 15 - Thread 2 - 14
Thread 1 - 12 - Thread 2 - 13
其中两个线程具有相同的numLanesLeft
-
Thread 1 - 16 - Thread 2 - 16
Thread 1 - 14 - Thread 2 - 14
Thread 1 - 12 - Thread 2 - 13
printf的结果("颜色:%i numLanesLeft:%i \ n",PlayerColor,numLanesLeft)
void ShooterAction(int rate,Color PlayerColor, int numRound) {
numLanesLeft = Gallery->Count();
// used to get the random lane
int randLane;
int getColor;
// while there are still lanes that haven't been shot at
while(numLanesLeft > 0) {
// only one operation, share lock
pthread_mutex_lock(&mutexLock);
printf("color: %i numLanesLeft: %i \n", PlayerColor, numLanesLeft);
// randomly pick a lane between 0 - 15
randLane = rand() % 16;
// if Rouge picked a lane that has already been fired at, look for a free lane
while(Gallery->Get(randLane) != white) {
randLane = rand() % 16;
}
// set the lane's colour
getColor = Gallery->Set(randLane, PlayerColor);
// set the thread to wait X amount of time to simulate a shot
usleep(1000000/rate);
// decrement the number of lanes
numLanesLeft--;
// upon lock for other threads
pthread_mutex_unlock(&mutexLock);
}
}
答案 0 :(得分:0)
问题出在方法的第一行
numLanesLeft = Gallery->Count();
numLanesLeft是一个全局变量,而不是被多个线程访问和更新而没有任何锁定。
如果第一个线程开始并且执行了16,15,14并且仅在第二个线程开始运行之后,他将在方法的开头重置numLanesLeft的值。
第二个问题:条件(numLanesLeft> 0)可能在线程检查它并开始等待锁定和锁定被释放之间发生变化,所以在关键时刻内检查条件是否更加安全(numLanesLeft) > 0)在开始运行之前仍然有效。
除此之外,我找不到任何理由让你有这样的结果!!
注意:建议使用" cout"而不是" printf"在c ++中