【发布时间】:2012-08-27 20:09:09
【问题描述】:
我很惊讶地从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 的访问是原子的和序列化的。
- 这段代码有什么问题导致死锁?
- 有没有更好的方法来实现这一点?
【问题讨论】:
-
旁注:这看起来像是一种实现并行快速排序的可怕方式?
-
你在
lock上打电话给pthread_mutex_init吗? -
这段代码不会死锁。死锁至少需要在尝试获取另一个锁时持有一个锁。你永远不会那样做。
-
但是,它就在我面前陷入僵局。
标签: c++ pthreads deadlock cilk cilk-plus