gpt4 book ai didi

c++ - 线程内的死锁

转载 作者:行者123 更新时间:2023-11-30 05:36:11 34 4
gpt4 key购买 nike

所以我的系统中出现了死锁,而且我终究无法弄清楚死锁在哪里。

基本上在我的系统中,我有一个包含 12 个元素的数组和对应于每个元素的 12 个锁。然后我有 2 个线程创建一个对数组执行计算的函数。但是每个线程一次在数组中执行两个元素更改。

如果每个线程只查看一个元素,则不会出现死锁,但如果每个线程查看两个元素,则很少会出现死锁。

这是我的代码:

Thread() {

- some other code that doesnt effect the threads -

// randomly pick a lane between 0 - 15
randLane1 = rand() % 16;
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]);
}
while(Gallery->Get(randLane2) != white || randLane2 == randLane1) {
pthread_mutex_unlock(&mutexFineLock[randLane2]);
randLane2 = rand() % 16;
pthread_mutex_lock(&mutexFineLock[randLane2]);
}

// set the lane's colour
Gallery->Set(randLane1, PlayerColor);
Gallery->Set(randLane2, PlayerColor);
// set the thread to wait X amount of time to simulate a shot
usleep(1000000/rate);

// upon lock for other threads
pthread_mutex_unlock(&mutexFineLock[randLane1]);
pthread_mutex_unlock(&mutexFineLock[randLane2]);


}

如果有人能够查明死锁发生的位置,那将是非常有帮助的。如果您需要我进一步说明系统,请询问。

最佳答案

在这部分代码中:

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

当 randLand2 == randlane1;

pthread_mutex_lock(&mutexFineLock[randLane2]);

永远不会成功,因为互斥体已经被锁定。为了避免这个问题;你可能会考虑做这样的事情:

int lockAcquired = 0;
while(!lockAcquired && Gallery->Get(randLane2) != white || randLane2 == randLane1) {
pthread_mutex_unlock(&mutexFineLock[randLane2]);
randLane2 = rand() % 16;
if (pthread_mutex_trylock(&mutexFineLock[randLane2]))
lockAcquired = 1;
}

关于c++ - 线程内的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33627719/

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