![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
c++多线程编程
for(inti=0;i<vStationNum;i++){m_CorDList.clear();for(std::list<RecDist>::iteratorvIti...
for (int i=0;i<vStationNum;i++)
{
m_CorDList.clear();
for(std::list<RecDist>::iterator vIti = m_Data.m_RDistList[i].begin(); vIti != m_Data.m_RDistList[i].end(); vIti++)
{
int istate = vIti->mystate;
m_CorDList.clear();
rdist = *vIti;
m_CorDList.push_back(rdist);
for(int j = i+1; j < vStationNum ;j++)
{
for(std::list<RecDist>::iterator vItj = m_Data.m_RDistList[j].begin(); vItj != m_Data.m_RDistList[j].end(); vItj++)
{
int jstate = vItj->mystate;
if (abs(jstate-istate)==0)
{
rdist = *vItj;
m_CorDList.push_back(rdist);
}
}
}
if (m_CorDList.size()>=5)//如果记录条数(站的个数)大于等于4
{
TDOAPos posTaylor;
posTaylor.x = 0;
posTaylor.y = 0;
posTaylor.z = 0;
std::map<int, TDOAPos> mapChan;//存储返回Chan方法中的主站号以及位置信息
mapChan = m_pAlgorithmImp->MyCalPosByChan_Over4Station(m_CorDList);//Chan方法估计位置返回主站号与位置信息//向mapChan写入数据
std::map<int, TDOAPos>::const_iterator map_Ite = mapChan.begin();
int baseA = map_Ite->first; //主站号
TDOAPos posChan;//Chan位置坐标
posChan.x = map_Ite->second.x;
posChan.y = map_Ite->second.y;
posChan.z = map_Ite->second.z;
vChanPos.push_back(posChan);//存储Chan得到的位置信息
posTaylor = m_pAlgorithmImp->MyTalyorMethod_Test(baseA, posChan, m_CorDList);//对Chan方法得到的数据进行泰勒迭代修正
vTayLorPos.push_back(posTaylor);
}
}
}
请问,现在我想用多线程实现这个操作,前面读取数据放在m_CorDList,如果大于等于5就执行下面的操作,我想将读取数据和if{}操作能不能用两个线程实现,一个是读取数据放在m_CorDList,另一个就是if{}操作。没接触过多线程,希望高手指点,最好给出详细实现过程!谢谢 展开
{
m_CorDList.clear();
for(std::list<RecDist>::iterator vIti = m_Data.m_RDistList[i].begin(); vIti != m_Data.m_RDistList[i].end(); vIti++)
{
int istate = vIti->mystate;
m_CorDList.clear();
rdist = *vIti;
m_CorDList.push_back(rdist);
for(int j = i+1; j < vStationNum ;j++)
{
for(std::list<RecDist>::iterator vItj = m_Data.m_RDistList[j].begin(); vItj != m_Data.m_RDistList[j].end(); vItj++)
{
int jstate = vItj->mystate;
if (abs(jstate-istate)==0)
{
rdist = *vItj;
m_CorDList.push_back(rdist);
}
}
}
if (m_CorDList.size()>=5)//如果记录条数(站的个数)大于等于4
{
TDOAPos posTaylor;
posTaylor.x = 0;
posTaylor.y = 0;
posTaylor.z = 0;
std::map<int, TDOAPos> mapChan;//存储返回Chan方法中的主站号以及位置信息
mapChan = m_pAlgorithmImp->MyCalPosByChan_Over4Station(m_CorDList);//Chan方法估计位置返回主站号与位置信息//向mapChan写入数据
std::map<int, TDOAPos>::const_iterator map_Ite = mapChan.begin();
int baseA = map_Ite->first; //主站号
TDOAPos posChan;//Chan位置坐标
posChan.x = map_Ite->second.x;
posChan.y = map_Ite->second.y;
posChan.z = map_Ite->second.z;
vChanPos.push_back(posChan);//存储Chan得到的位置信息
posTaylor = m_pAlgorithmImp->MyTalyorMethod_Test(baseA, posChan, m_CorDList);//对Chan方法得到的数据进行泰勒迭代修正
vTayLorPos.push_back(posTaylor);
}
}
}
请问,现在我想用多线程实现这个操作,前面读取数据放在m_CorDList,如果大于等于5就执行下面的操作,我想将读取数据和if{}操作能不能用两个线程实现,一个是读取数据放在m_CorDList,另一个就是if{}操作。没接触过多线程,希望高手指点,最好给出详细实现过程!谢谢 展开
3个回答
展开全部
这应该是内存共享式的多线程,要注意的是要设定好互斥访问信号量,如果没设信号量,假如正好在判断m_CorDList数据个数时(假如当时数据数小于5)的同时另一线程又住m_CorDList里添加数据,在下一次的if判断时m_CorDList中的数据个数就可能远远多于5个,加入互斥访问信号量,在if判断时不允许其他线程往m_CorDList中写数据,而且在添加数据的线程在每添加数据之前也要先判断m_CorDList中数据是否大于等于5个,如果大于等于5个就不要添加。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加一个互斥量和条件变量,在读取数据线程读取完数据判断是否大于5,大于5激活条件变量,处理线程开始工作处理数据。
处理线程在数据量小于5时候wait条件变量,一旦条件变量被激活开始处理。
很简单,看看Windows核心编程。
处理线程在数据量小于5时候wait条件变量,一旦条件变量被激活开始处理。
很简单,看看Windows核心编程。
更多追问追答
追问
for循环中是读取m_Data中数据,读取完后,判断是否大于5,大于5就处理,处理完以后再读取数据进行处理。这是顺序执行的流程,用多线程实现的话,主要是不知道读取m_Data数据操作怎么写,难道还是for循环吗?for循环中i是变的,所以数据每次也不一样。现在很迷糊,不知道如何将顺序的改成多线程(我只知道上面的应该可以使用两个线程来实现)。还请高手帮下忙,谢谢
追答
不太明白你这么做的意义。不过感觉你应该把上面的所有单独放到一个线程里面,在主线程里面只用判断一下m_Data的数据量就行了,其他的交给工作线程去做就行了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
读写分来2个函数
读函数 写函数 各放入一条线程
然后对m_CorDList读写加锁 注意同步互斥就行了
可以这样理解 写函数是生产者 读函数是 消费者 典型的生产者消费者模型
读函数 写函数 各放入一条线程
然后对m_CorDList读写加锁 注意同步互斥就行了
可以这样理解 写函数是生产者 读函数是 消费者 典型的生产者消费者模型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询