繁体   English   中英

线程导致意外崩溃

[英]Threading causes unexpected crash

我不知道这里是什么问题,但是当我在OS X上运行代码时,它可以正常运行,但是在Linux上,我的程序将无法运行。

这是我的代码:

Thread() {
                       - some other code - 
           randLane1 = rand() % 16; 
           randLane2 = rand() % 16; 

           while(randLane1 == randLane2) {
               randLane2 = rand() % 16; 
           }
           pthread_mutex_lock(&mutexFineLock[randLane1]);
           pthread_mutex_lock(&mutexFineLock[randLane2]);
           // if Rouge picked a lane that has already been fired at, look for a free lane
           while(Gallery->Get(randLane1) != white) {
              pthread_mutex_unlock(&mutexFineLock[randLane1]);
              randLane1 = rand() % 16; 
              pthread_mutex_lock(&mutexFineLock[randLane1]);
           }   
           pthread_mutex_unlock(&mutexFineLock[randLane2]);

}

现在,如果我删除了pthread_mutex_lock(&mutexFineLock[randLane2]); pthread_mutex_unlock(&mutexFineLock[randLane2]); ,它将正常运行。 但是是什么导致了错误呢? 如果我只是简单地打开和关闭锁而不会出现死锁,那是什么问题?

如果我将我的pthread_mutex_unlock(&mutexFineLock[randLane2]);使我更加困惑pthread_mutex_unlock(&mutexFineLock[randLane2]); 就在我的pthread_mutex_lock(&mutexFineLock[randLane2]); 它将正常工作。

注意:在我的代码中pthread_mutex_unlock(&mutexFineLock[randLane2]); 为了达到目的,将其放置在更下方以执行上面代码中未显示的操作。 我正在调试错误,意识到它甚至无法通过for循环。

如果有人知道我的问题在哪里,那就太好了。

例:

第一个线程已锁定mutexFineLock [randLane1 = 13],然后mutexFineLock [randLane2 = 12]正常工作。

第二个线程已锁定mutexFineLock [randLane1 = 3],然后尝试锁定已锁定的mutexFineLock [randLane2 = 12],正在等待。

处理第一个线程时,释放了MutexFineLock [randLane1 = 13],然后尝试锁定被第二个线程锁定的MutexFineLock [randLane1 = 13%16 = 3]。 等候。

最终,每个人​​都因为死锁而等待着。

当您立即解锁randLane2时,第二个线程不必等待,因此可以正常工作。

这是个问题。

您自己创建一个死锁。 (至少只要您不向我们显示您的互斥量定义)。

    while(Gallery->Get(randLane1) != white) {
        pthread_mutex_unlock(&mutexFineLock[randLane1]);
        randLane1 = rand() % 16; <---------------- PHAIL
        pthread_mutex_lock(&mutexFineLock[randLane1]);
    }   

如果randLane1等于randLane2 ,则尝试再次重新锁定相同的互斥锁。

避免由于错误的锁顺序而导致死锁

    pthread_mutex_lock(&mutexFineLock[randLane2]);
    pthread_mutex_lock(&mutexFineLock[randLane1]);

重试以获取不同的lane1和2。编辑:将randLane2更改为1。

    while(Gallery->Get(randLane1) != white) {
        pthread_mutex_unlock(&mutexFineLock[randLane1]);
        randLane1 = rand() % 16;
        while(randLane1 == randLane2) { // retry
           randLane1 = rand() % 16; 
        }
        pthread_mutex_lock(&mutexFineLock[randLane1]);
    }   

僵局的一个经典例证。 解锁顺序不是相反的锁定顺序。 lock(m1); lock(m2); unlock(m1) lock(m1); lock(m2); unlock(m1)是灾难的书本。 您应始终按互斥锁的相反顺序解锁互斥锁(或其他锁)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM