请教关于map的线程安全

zhuxun_37 2013-06-26 03:55:24
加入有这样一个map:
typedef struct {int a, string s} A;
map<int, A> mapia;
// 初始化 mapia[0], mapia[1] ... mapia[10]

线程A:
lock();
A *sa = &mapia[0];
unlock();
// 使用 sa 的值
fprintf(stderr, "a: %d", sa->a);

线程B:
// 可能会插入/删除其他值, 但肯定不会对 mapia[0] 有写操作


问题:
在并发条件下, 线程A中, 使用sa时(比如向上面的fprintf操作), 需要加锁吗?
...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-06-26
  • 打赏
  • 举报
回复
http://www.sgi.com/tech/stl/thread_safety.html
zybjtu 2013-06-26
  • 打赏
  • 举报
回复
不需要啊,vector是顺序容器,类似于数组,扩容的时候,要求地址是连续的。所以会出现二楼所说的地址改变的问题。对于map来说,其归根结底是红黑树实现的,树的话,扩容是不需要改变的。
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
尽管如此,就怕某个容器为了保证数据完整性而这样干: ... map<int A> tmp_map(mapia); //处理tmp_map中的数据,没有改用mapia[0] ... //处理完成,没有出现异常,应用到mapia tmp_map.swap(mapia);
rocktyt 2013-06-26
  • 打赏
  • 举报
回复
引用 6 楼 mougaidong 的回复:
这个我还真没测过,只亲自测过vector。 [quote=引用 5 楼 u010936098 的回复:] [quote=引用 4 楼 mougaidong 的回复:] 是的,有可能会 [quote=引用 3 楼 zhuxun_37 的回复:] [quote=引用 1 楼 mougaidong 的回复:] 肯定要加锁的,因为容器可能扩容
你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?[/quote][/quote] 不会。map、multimap、set、multiset、list保证在删除和添加元素时原有的迭代器、元素指针和元素引用有效并且正确,只要这个元素不是被删除的元素。[/quote][/quote]这是标准,不是测不测的问题
turing-complete 2013-06-26
  • 打赏
  • 举报
回复
这个我还真没测过,只亲自测过vector。
引用 5 楼 u010936098 的回复:
[quote=引用 4 楼 mougaidong 的回复:] 是的,有可能会 [quote=引用 3 楼 zhuxun_37 的回复:] [quote=引用 1 楼 mougaidong 的回复:] 肯定要加锁的,因为容器可能扩容
你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?[/quote][/quote] 不会。map、multimap、set、multiset、list保证在删除和添加元素时原有的迭代器、元素指针和元素引用有效并且正确,只要这个元素不是被删除的元素。[/quote]
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
引用 4 楼 mougaidong 的回复:
是的,有可能会 [quote=引用 3 楼 zhuxun_37 的回复:] [quote=引用 1 楼 mougaidong 的回复:] 肯定要加锁的,因为容器可能扩容
你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?[/quote][/quote] 不会。map、multimap、set、multiset、list保证在删除和添加元素时原有的迭代器、元素指针和元素引用有效并且正确,只要这个元素不是被删除的元素。
turing-complete 2013-06-26
  • 打赏
  • 举报
回复
是的,有可能会
引用 3 楼 zhuxun_37 的回复:
[quote=引用 1 楼 mougaidong 的回复:] 肯定要加锁的,因为容器可能扩容
你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?[/quote]
zhuxun_37 2013-06-26
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
肯定要加锁的,因为容器可能扩容
你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
不需要,只要其它线程不去删除这个元素,它就永远有效。
turing-complete 2013-06-26
  • 打赏
  • 举报
回复
肯定要加锁的,因为容器可能扩容

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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