gpt4 book ai didi

c++ - pthreads mutex 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:52 26 4
gpt4 key购买 nike

我正在 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]);
}

奇怪的是,如果我取消注释一个(哪个并不重要)或两个 cout,程序会按预期运行,不会发生任何错误(但这显然会降低性能,并且不是一个优雅的解决方案),给出正确的输出。

box 是全局声明的 vector < vector < vector <粒子_t*>>>框这表示将我的(正方形)域分解为框。

当循环开始时,所有 i、j 的 box[i][j].size() 已设置为零,并且循环应该将粒子放回盒结构(get_id 函数给出正确的结果,我检查过)

数组 pthread_mutex_t 锁被声明为全局的

pthread_mutex_t * 锁,

并且大小由线程 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,代码也会运行,而且似乎我运行的处理器越多,段错误发生的时间就越早(它在两个处理器上运行了一次整个模拟,但这似乎是一个异常(exception))

谢谢

最佳答案

这只是一个有根据的猜测,但如果你对所有的盒子使用一个锁,问题就会消失:push_back 必须分配内存,它通过 std 完成: :allocator 模板。我不认为 allocator 保证是线程安全的,我也不认为它保证被分区,每个 vector 一个。 (底层的 operator new 线程安全的,但是 allocator 通常会使用 block 切片技巧来分摊 operator new的成本。)

你用reserve实用吗提前为所有 vector 预分配空间,使用一些保守估计每个盒子中将有多少粒子结束?这是我首先要尝试的。

我想尝试的另一件事是对所有盒子使用一个锁,我们知道这是可行的,但是将锁定/解锁操作移到 for 循环之外,以便每个线程都可以存储所有它的项目一次。这实际上可能比您尝试做的更快——更少的锁抖动。

关于c++ - pthreads mutex 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159960/

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