繁体   English   中英

pthreads_mutex的段错误

[英]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以便每个线程可以一次存储所有项目。 这实际上可能比您要尝试的要快-更少的锁抖动。

boxbox[i]向量是否正确初始化? 您只说设置了向量的最里面的集合。 否则,看起来box_idxy组件是错误的,并且从数组之一的末端开始运行。

它崩溃的外观是哪一部分?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM