我正在编写一个简单的多线程程序来添加和访问多线程向量中的成员:
线程1:使用push_back
将成员添加到矢量
线程2:调用函数迭代向量并检查成员是否已经在向量中然后返回它,否则返回NULL
有一段时间我在线程2遇到了Segmentation错误。矢量是否符合我上面提到的线程安全性。我没有任何代码可以从向量中删除成员,只添加更多。
这是函数的完整代码迭代向量:
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;
}
答案 0 :(得分:1)
您需要同步两个线程。因为向量不是线程安全的。如果从一个线程修改向量并从另一个线程访问,则很有可能出现分段错误。您可能需要查看uniqe_lock或lock_guard和mutex以获取详细信息。如果您对其用法一无所知,请发表评论。快乐的多线程。
已编辑:来自@GianPaolo的评论
push_back
将以一种非线程安全的方式修改向量的内部状态。如果在向量已达到其容量时调用push_back,则使用的当前T []数组将被复制到新的T [](更大的大小)中,原始文件将被删除。当另一个线程在向量上迭代时,你不能安全地做什么