[英]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.