两个线程读写同一个vector,加了临界区同步,但是仍然弹出断言失败,因为肯定同步这里是没问题的,但是实在找不出其他原因而反复出现这个错误,只好看下出错的源代码,如下。_Compat是vector的const iterator的成员函数,在-/</==运算符中会被调用,这条语句if (this->_Getcont() == 0 || this->_Getcont() != _Right._Getcont())左右两个迭代器的所属容器是否相同
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pairif (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
出现这个错误还有一种情况:删除(erase)一个元素后,iterator没有更新,因为删除一个元素后,iterator不会自动指向下一个位置,但是erase为我们做了一部分,他的返回值正是指向被删除的元素的下一个位置,所以如果要继续删除元素的后续元素时,可以这样写,it = v.erase(it);否则就出现vector iterators incompatible的错误。