c++ - 如何在被 OpenMP 中的线程修改后将列表刷新到内存
问题描述
我有一个在 OpenMP 上的 2 个线程之间共享的列表。该列表作为对每个线程调用的外部函数的引用传递。在函数中,每个线程都会生成一个私有链表,锁定共享链表,通过splice()将私有链表加入共享链表。当 splice() 在每个线程中发生时,我使用了 omp_lock_t,但是 2 个线程完成后生成的共享列表不正确,就好像另一个线程没有看到当前线程对共享列表所做的更改一样。我应该怎么办?
int main(int argc, char** argv)
{
list<string> shared_list;
omp_lock_t l0;
omp_init_lock(&l0);
#pragma omp parallel num_threads(2)
{
external_function(shared_list, &l0);
}
}
external function(list<string>& shared_list, omp_lock_t* l0)
{
list<string> local_list;
for (int i = 0; i < 10; i++)
{
local_list.push_back("Aloha");
}
omp_set_lock(l0);
shared_list.splice(shared_list.end(), local_list);
omp_unset_lock(l0);
}
解决方案
推荐阅读
- php - 是否有一个 php 函数可以将 nofollow 添加到链接?
- excel - 尝试从宏打开多个工作表时关闭弹出窗口
- javascript - 使用 Falcor 设置请求标头
- html - 仅在 iOS 上,滚动后粘性表格标题会脱落
- python - 在带有 cPickle 的 python 3.7 上使用 python 2.7 代码时出现 UnicodeDecodeError
- excel - 特定数据集的重复值、多个条件和计数
- reactjs - 在异步函数的回调中设置状态
- tensorflow - 用于 keras model.fit 的 steps_per_epoch 与数据增强
- vue.js - 如何在选择标签中呈现来自 api 的数据?
- vba - 从多个附加的电子邮件中提取嵌套文件