- 主题:大佬们,帮看看std::map迭代器和引用失效方面的问题?
根据C++的std::map的文档说明,插入数据后不会导致迭代器和引用失效, 那么一个线程向一个std::map插入数据,而别一个线程向同一个std::map查找数据,这个std::map不加锁,是否会出现问题?
deepseek的说法如下:
用户可能认为,因为迭代器不会失效,所以查找线程不会被中断。但实际上,插入操作可能修改内部结构,导致查找线程看到中间状态,破坏map的不变性。比如,红黑树的旋转操作可能会临时改变节点链接,此时查找可能会错误地访问节点。
大佬们是怎么理解文档所说:插入数据后不会导致迭代器和引用失效? 难道文档所说“插入后” 很容易让我们这些小白忽略,插入时会导致问题!!!
--
FROM 210.13.68.*
【 在 cat201702 的大作中提到: 】
: 根据C++的std::map的文档说明,插入数据后不会导致迭代器和引用失效, 那么一个线程向一个std::map插入数据,而别一个线程向同一个std::map查找数据,这个std::map不加锁,是否会出现问题?
: deepseek的说法如下:
: 用户可能认为,因为迭代器不会失效,所以查找线程不会被中断。但实际上,插入操作可能修改内部结构,导致查找线程看到中间状态,破坏map的不变性。比如,红黑树的旋转操作可能会临时改变节点链接,此时查找可能会错误地访问节点。
: ...................
--
FROM 210.13.68.*
【 在 cat201702 的大作中提到: 】
: 根据C++的std::map的文档说明,插入数据后不会导致迭代器和引用失效, 那么一个线程向一个std::map插入数据,而别一个线程向同一个std::map查找数据,这个std::map不加锁,是否会出现问题?
: deepseek的说法如下:
: 用户可能认为,因为迭代器不会失效,所以查找线程不会被中断。但实际上,插入操作可能修改内部结构,导致查找线程看到中间状态,破坏map的不变性。比如,红黑树的旋转操作可能会临时改变节点链接,此时查找可能会错误地访问节点。
: ...................
这个就是 金鱼 说的 COW 问题呀,写完后commit。
map的实现没有考虑这个问题,需要自己弄。
--
FROM 221.218.61.*
迭代器可以类比理解为“指针”。迭代器保持有效,也就是指向老元素的指针不变。
但红黑树翻转等操作,会改变元素的前驱、后继等,也就是容器中迭代器的++、end()等操作,需要加锁。
--
FROM 114.254.115.*
不矛盾,stl本身就不是thread safe的,标准说的是,在single thread情况下,插入以后,原先的iterator的确不是失效,还是指向原来的元素
DS说的是,在multi-thread读写同时操作的情况下,插入+维护iterator指向的工作并不是atomic的,所以老的iterator会看见中间状态,但是一旦维护iterator的工作完成,老的iterator还是指向原来的元素
【 在 cat201702 的大作中提到: 】
: 根据C++的std::map的文档说明,插入数据后不会导致迭代器和引用失效, 那么一个线程向一个std::map插入数据,而别一个线程向同一个std::map查找数据,这个std::map不加锁,是否会出现问题?
: deepseek的说法如下:
: 用户可能认为,因为迭代器不会失效,所以查找线程不会被中断。但实际上,插入操作可能修改内部结构,导致查找线程看到中间状态,破坏map的不变性。比如,红黑树的旋转操作可能会临时改变节点链接,此时查找可能会错误地访问节点。
: ...................
--
修改:ziqin FROM 183.128.142.*
FROM 183.128.142.*
多线程与这个问题风马牛不相及
【 在 cat201702 的大作中提到: 】
: 根据C++的std::map的文档说明,插入数据后不会导致迭代器和引用失效, 那么一个线程向一个std::map插入数据,而别一个线程向同一个std::map查找数据,这个std::map不加锁,是否会出现问题?
: deepseek的说法如下:
: 用户可能认为,因为迭代器不会失效,所以查找线程不会被中断。但实际上,插入操作可能修改内部结构,导致查找线程看到中间状态,破坏map的不变性。比如,红黑树的旋转操作可能会临时改变节点链接,此时查找可能会错误地访问节点。
: ...................
--
FROM 111.194.200.*