gpt4 book ai didi

c++ - 线程导致意外崩溃

转载 作者:行者123 更新时间:2023-11-28 02:17:28 26 4
gpt4 key购买 nike

我不知道这里的问题是什么,但是当我在 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 循环。

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

最佳答案

例子:

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

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

虽然处理第一个线程已释放 mutexFineLock[randLane1=13],然后尝试锁定被第二个线程锁定的 mutexFineLock[randLane1=13%16=3]。等待。

终于大家因为死锁而等待。

当你立即解锁 randLane2 时,第二个线程不必等待,所以它工作正常。

这是个问题。

关于c++ - 线程导致意外崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33632107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com