我正在编写一个简单的多线程程序,以在多线程中的向量中添加和访问成员:
线程1:使用push_back
将成员添加到向量
线程2:通过向量拨打函数迭代并检查成员是否已经在向量中,然后返回,否则返回NULL
在某个时候,我在线程2处面对分段故障,是向量安全性,以便在上面提到的事情。我没有任何代码可以从向量中删除成员,只添加更多代码。
这是函数的完整代码迭代向量:
Scope* ScopeList::FindScope(int32_t domain, int32_t channel) {
Scope* findItem = new Scope(domain, channel);
Scope* resultItem = NULL;
for(uint32_t i = 0U; i < m_scope_list.size(); i++) {
if(m_scope_list.at(i) == NULL) {
continue;
}
if(m_scope_list.at(i)->isEqual(findItem)) {
resultItem = m_scope_list.at(i);
break;
}
}
delete findItem;
findItem = NULL;
return resultItem;
}
这里m_scope_list
是Scope
对象的向量,isEqual
函数的定义如下:
bool Scope::isEqual(Scope* scope) {
if(scope == NULL||!this->m_domain ||!this->m_channel){
return false;
}
bool result = this->m_domain == scope->GetDomain() && this->m_channel == scope->GetChannel();
return result;
}
您需要同步两个线程。因为向量不是线程安全。如果您从一个线程中修改向量并从另一个线程访问,则很有可能会获得分割故障。您可能需要查看uniqe_lock或lock_guard和sutex以获取详细信息。如果您对他们的用法一无所知,请发表评论。快乐的多线程。
编辑:来自@gianpaolo发表的评论
push_back
将以无法安全的方式修改向量的内部状态。如果您在已经达到其容量的矢量时调用push_back,则使用的当前t []数组将在新的t [](较高尺寸)中复制,并且将删除原件。当另一个线程在向量