gpt4 book ai didi

c++ - 为什么这段代码会导致死锁?

转载 作者:太空狗 更新时间:2023-10-29 19:59:38 25 4
gpt4 key购买 nike

pstack看到这段代码导致死锁,我很惊讶!我没有看到相同的原因。

pthread_mutex_t lock;

_Cilk_for (int i = 0; i < N; ++i) {
int ai = A[i];
if (ai < pivot) {
pthread_mutex_lock(&lock);
A[ia++] = ai;
pthread_mutex_unlock(&lock);
}
else if (ai > pivot) {
pthread_mutex_lock(&lock);
A[ib++] = ai;
pthread_mutex_unlock(&lock);
}
else {
pthread_mutex_lock(&lock);
A[ic++] = ai;
pthread_mutex_unlock(&lock);
}
}

我只是使用互斥体来确保对 A 的访问是原子的和序列化的。

  • 这段代码有什么问题导致死锁?
  • 有没有更好的方法来实现它?

最佳答案

如果那是函数内部的代码,那么您就没有正确初始化互斥量。您需要将它设置为 PTHREAD_MUTEX_INITIALIZER(对于简单的默认互斥锁)或对其执行 pthread_mutex_init()(对于更复杂的要求)。如果没有正确的初始化,您将不知道互斥锁开始时的状态 - 它很可能处于锁定状态,因为在该位置发生在堆栈上的任何东西看起来都像是锁定的互斥锁。

这就是为什么它总是需要以某种方式初始化,这样初始状态就毫无疑问了。

您可能遇到的另一个潜在问题是:

int ai = A[i];

可能应该使用相同的互斥锁来保护该访问,否则您可能会在“半状态”下读取它(当另一个线程只是更新变量的一部分时)。


而且,我不得不说,我不确定这里是否正确使用了线程。互斥锁的使用可能会淹没像 A[ia++] = ai 这样的语句,以至于绝大部分时间都花在锁定和解锁互斥锁上。它们通常在锁定期间处理的代码稍微多一点的情况下更有用。

您可能会发现一个非线程变体会把这个变体从水中吹出来(但是,当然,不要相信我的话 - 我的主要优化口号是“衡量,不要猜测” )。

关于c++ - 为什么这段代码会导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12241910/

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