是否存在写入冲突,应该如何解决

忆幽梦 2010-11-14 02:12:50
int assembleIndex()
{
int n;
int i, j, nrt, nct;
int threads = omp_get_num_procs();
cout << "The number of threads is " << threads << endl;

map<int, map<int, int>> *sList = new map<int, map<int, int>> [param.nn];

#pragma omp parallel num_threads(threads)
{
#pragma omp for private(i, j, nrt, nct)
for (n = 0; n < param.ne; ++n)
{
for (i = 0; i < param.nen; ++i)
{
nrt = d.noc[param.nen * n + i] - 1;
for (j = 0; j < param.nen; ++j)
{
nct = d.noc[param.nen * n + j] - 1;
sList[nrt][nct].insert(make_pair(n, i * 8 + j));
}
}
}
}
return 0;
}

先上代码了,其中sList[nrt][nct].insert(make_pair(n, i * 8 + j));是否存在写入冲突呢?怎么解决?
...全文
162 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyimu 2010-11-17
  • 打赏
  • 举报
回复
TBB中实现了线程安全的容器类,还有LZ结贴给分啦
忆幽梦 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuyimu 的回复:]

如果你的数据结构本身不是线程安全的,就不能直接进行多线程的写入操作,必须加锁保护。在JAVA中,Map等常用数据结构是实现了原子操作的,可以保证线程安全,但是STL中则无此保证,LZ需要搞清楚这个问题
[/Quote]
明白了,我了解下相关内容,决定要么修改算法,要不是是用intel 的TBB中提供的容器实现~
liuyimu 2010-11-14
  • 打赏
  • 举报
回复
#pragma omp parallel num_threads(threads)
{
#pragma omp for private(i, j, nrt, nct)
for (n = 0; n < param.ne; ++n)
{
for (i = 0; i < param.nen; ++i)
{
nrt = d.noc[param.nen * n + i] - 1;
for (j = 0; j < param.nen; ++j)
{
nct = d.noc[param.nen * n + j] - 1;
sList[nrt][nct].insert(make_pair(n, i * 8 + j));
}
}
}
}
你这个有必要分成两行写?
直接写 #pragma omp for private(i, j, nrt, nct) num_threads(threads)
for (n = 0; n < param.ne; ++n)
{
for (i = 0; i < param.nen; ++i)
{
nrt = d.noc[param.nen * n + i] - 1;
for (j = 0; j < param.nen; ++j)
{
nct = d.noc[param.nen * n + j] - 1;
sList[nrt][nct].insert(make_pair(n, i * 8 + j));
}
}
}
另,你这里涉及到数据结构的操作,建议不要轻率使用并行,你首先要搞清楚这个问题,MAP这个数据结构是不是是线程安全的,如果不是,即便不存在写入冲突,也能这样用。
liuyimu 2010-11-14
  • 打赏
  • 举报
回复
如果你的数据结构本身不是线程安全的,就不能直接进行多线程的写入操作,必须加锁保护。在JAVA中,Map等常用数据结构是实现了原子操作的,可以保证线程安全,但是STL中则无此保证,LZ需要搞清楚这个问题
忆幽梦 2010-11-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liuyimu 的回复:]
#pragma omp parallel num_threads(threads)
{
#pragma omp for private(i, j, nrt, nct)
for (n = 0; n < param.ne; ++n)
{
for (i = 0; i < param.nen; ++i)
{
nrt = d.noc[param.nen * n + ……
[/Quote]
分两行写,是个习惯问题。我知道这样麻烦。
还有对你的话,我没有能够理解,“如果不是”是说不是安全的么?
另外,我对数据结构理解不是很好,我觉得是安全,你能举一个不安全的例子么?
谢谢~

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧