线程中的死锁

时间:2015-11-07 23:45:49

标签: c++ multithreading synchronization

所以我不确定问题出在哪里,我觉得这是一个基本的锁定设置。每个线程都试图获取锁定,而另一个线程可以通过临界区,而另一个线程必须等到线程释放锁定。

但奇怪的是,我的数字左边'对于线程来说有时是相同的。

例如,它应该是:

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);
        }
}

1 个答案:

答案 0 :(得分:0)

问题出在方法的第一行

numLanesLeft = Gallery->Count();

numLanesLeft是一个全局变量,而不是被多个线程访问和更新而没有任何锁定。

如果第一个线程开始并且执行了16,15,14并且仅在第二个线程开始运行之后,他将在方法的开头重置numLanesLeft的值。

第二个问题:条件(numLanesLeft> 0)可能在线程检查它并开始等待锁定和锁定被释放之间发生变化,所以在关键时刻内检查条件是否更加安全(numLanesLeft) > 0)在开始运行之前仍然有效。

除此之外,我找不到任何理由让你有这样的结果!!

注意:建议使用" cout"而不是" printf"在c ++中