首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问关于地图的线程安全

2013-07-01 
请教关于map的线程安全加入有这样一个map:typedef struct {int a, string s} Amapint, A mapia// 初始

请教关于map的线程安全
加入有这样一个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操作), 需要加锁吗?
[解决办法]
不需要,只要其它线程不去删除这个元素,它就永远有效。
[解决办法]

引用:
这个我还真没测过,只亲自测过vector。

Quote: 引用:

Quote: 引用:

是的,有可能会

Quote: 引用:

Quote: 引用:

肯定要加锁的,因为容器可能扩容


你的意思是说, 如果插入 mapia[11] 的话, 会改变 mapia[0] 中数据存储的地址?


不会。map、multimap、set、multiset、list保证在删除和添加元素时原有的迭代器、元素指针和元素引用有效并且正确,只要这个元素不是被删除的元素。
这是标准,不是测不测的问题
[解决办法]
不需要啊,vector是顺序容器,类似于数组,扩容的时候,要求地址是连续的。所以会出现二楼所说的地址改变的问题。对于map来说,其归根结底是红黑树实现的,树的话,扩容是不需要改变的。
[解决办法]
http://www.sgi.com/tech/stl/thread_safety.html

热点排行