首页 > 解决方案 > 如何“原子地”总结 C++ 向量的元素?

问题描述

有多种方法可以总结 C++ vector 的元素,但是如何“原子地”保证这一点?在求和动作期间,向量的元素可能被其他线程修改,导致未知结果。有没有一种无锁的方法来防止向量被修改,直到求和完成?

标签: c++multithreadingc++11vectorthread-safety

解决方案


在线程之间共享对向量的可变引用可能会导致非常奇怪的错误。例如,可以通过在另一个线程中追加或删除项目来使读取迭代器无效。

恕我直言,唯一的解决方案是将向量隐藏在某个层后面,该层记录了修改线程中的插入/删除/更新,这样该线程就不必获取互斥体,因此不会阻塞。一旦它可以获取互斥体,它就可以应用排队的突变。

也就是说,您可以考虑一次只由一个线程拥有和引用该向量,以避免所有这些问题。


推荐阅读