请教关于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是顺序容器,类似于数组,扩容的时候,要求地址是连续的。所以会出现二楼所说的地址改变的问题。对于map来说,其归根结底是红黑树实现的,树的话,扩容是不需要改变的。
[解决办法]
http://www.sgi.com/tech/stl/thread_safety.html