读书人

多个线程读写std:地图读线程需要加锁

发布时间: 2012-11-17 11:14:15 作者: rapoo

多个线程读写std::map,读线程需要加锁吗
问题描述:
1. 有多个线程同时操作一个map
2. 有的线程会对map做 插入 或删除操作,那么所有写的地方都加锁
3. 有些线程只是读map的内容,这样需要加锁吗? 读有两种,一种是find,一种是iter循环

[解决办法]
全部只是读的话不需要。
有一个线程会写的话,只读的线程也要加锁。
[解决办法]
同上,有写就要枷锁
[解决办法]
++

探讨
全部只是读的话不需要。
有一个线程会写的话,只读的线程也要加锁。

[解决办法]
只要有写操作就应该加锁,读的过程中iter有可能会改变。
[解决办法]
必须加锁.
[解决办法]
探讨
全部只是读的话不需要。
有一个线程会写的话,只读的线程也要加锁。

[解决办法]
探讨

引用:
全部只是读的话不需要。
有一个线程会写的话,只读的线程也要加锁。
 突然发现好笑,全部只是读的话,这程序能干什么呢?结论就是,要加锁。

[解决办法]
需要加锁
[解决办法]
探讨

引用:
只要有写操作就应该加锁,读的过程中iter有可能会改变。

如果只用find呢,会受到迭代器的影响吗?

[解决办法]
估计会有异常,楼主你最好写个小测试程序测一下,如果没加锁,出了异常,那就没话说了。
[解决办法]
只要多线程读写就需要同步!
[解决办法]
http://www.sgi.com/tech/stl/thread_safety.html

只要有写的动作,就有可能改变map内部的结构,致使当前已获得的迭代器失效。
既然用迭代器了,就全程上锁吧
[解决办法]
如果线程都对其写的话,加锁是必须的
[解决办法]
可以做 lock-free 的, 读不加锁, 写要复制一份, 改写, 然后再回写, 有些情况下还是比较合适. 等有DCAS原语了这样做就会流行...


[解决办法]
lock_free也是一种锁。
[解决办法]
探讨

全部只是读的话不需要。
有一个线程会写的话,只读的线程也要加锁。

读书人网 >C++

热点推荐