[英]Seg faults with pthreads_mutex
我正在pthreads中实现一个粒子交互模拟器,并且在我的pthreads代码中不断出现分段错误。 错误发生在以下循环中,每个线程在我的thread_routine的每个时间步结束时执行此操作:
for (int i = first; i < last; i++)
{
get_id(particles[i], box_id);
pthread_mutex_lock(&locks[box_id.x + box_no * box_id.y]);
//cout << box_id.x << "," << box_id.y << "," << thread_id << "l" << endl;
box[box_id.x][box_id.y].push_back(&particles[i]);
//cout << box_id.x << box_id.y << endl;
pthread_mutex_unlock(&locks[box_id.x + box_no * box_id.y]);
}
奇怪的是,如果我取消注释(不管是哪一个)或两个注释,程序都会按预期运行,不会发生任何错误(但这显然会降低性能,并且不是一个很好的解决方案),提供正确的输出。
box是一个全局声明的vector <vector <vector <vector <粒子_t *>>> box,它表示将我的(平方)域分解为box。
循环开始时,将所有i,j的box [i] [j] .size()都设置为零,并且该循环应该将粒子放回到box-结构中(get_id函数给出正确的结果,I已经检查过)
数组pthread_mutex_t的锁被声明为全局
pthread_mutex_t * locks
,
大小是由线程0设置的,而锁是由线程0初始化的,然后再创建其他线程:
locks = (pthread_mutex_t *) malloc( box_no*box_no * sizeof( pthread_mutex_t ) );
for (int i = 0; i < box_no*box_no; i++)
{
pthread_mutex_init(&locks[i],NULL);
}
您有什么可能的原因吗? 如果将处理器数量设置为1,代码也将运行,并且我运行的处理器越多,则seg错误越早发生(它在两个处理器上一次都在整个模拟中运行,但这似乎是一个错误。例外)
谢谢
这只是一个有根据的猜测,但是如果您对所有盒子使用一个锁,这个问题就会消失: push_back
必须通过std::allocator
模板分配内存。 我认为allocator
不能保证是线程安全的,也不保证可以分配给每个vector
一个。 (底层的operator new
是线程安全的,但是allocator
通常会执行块切片技巧来摊销operator new
的成本。)
您是否可以使用reserve
空间为所有向量提前分配空间,这是对每个盒子中将要结成多少粒子的保守估计,这是否可行? 那是我要尝试的第一件事。
我想尝试的另一件事是对所有盒子使用一个锁,我们知道这是可行的,但是将锁定/解锁操作移到了for
循环之外for
以便每个线程可以一次存储所有项目。 这实际上可能比您要尝试的要快-更少的锁抖动。
box
和box[i]
向量是否正确初始化? 您只说设置了向量的最里面的集合。 否则,看起来box_id
的x
或y
组件是错误的,并且从数组之一的末端开始运行。
它崩溃的外观是哪一部分?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.