【发布时间】:2015-11-10 14:18:44
【问题描述】:
我不知道问题出在哪里,但是当我在 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_lock(&mutexFineLock[randLane2]); 之后,这会进一步增加我的困惑。
注意:在我的代码中pthread_mutex_unlock(&mutexFineLock[randLane2]); 有一个目的,它被放置在更下方以执行上面代码中未显示的操作。我正在调试我的错误,并意识到它甚至无法通过 for 循环。
如果有人知道我的问题出在哪里,那就太好了。
【问题讨论】:
-
它是如何崩溃的?您是否尝试过在调试器中运行它,例如
gdb? -
始终以与锁定相反的顺序解锁您的锁,否则您确实有可能出现死锁。或者尝试重构代码,使您一次只需要一把锁。
-
假设我们有两个线程,A 和 B。线程 A 锁定两个锁,而线程 B 被阻塞等待第一个锁。然后线程 A 进入循环并解锁第一个锁,并被线程 B 抢占,线程 B 获得第一个锁,然后被阻塞等待第二个锁。线程 A 再次开始运行,但由于线程 B 现在持有它,因此无法取回第一个锁。死锁。
-
@QQCompi 如果您的数组有十二个元素,
rand() % 16不是生成有效索引的好方法。 -
我希望 pthread_mutex_t mutexFineLock[12] 真的是 [16] 或者你有另一个错误。
标签: c++ multithreading locks